将对象成员传递给需要整数的模板函数
Passing a object member to a template function expecting an integer
我一直在阅读和阅读提出类似问题的帖子,但我的疑虑仍然存在。
所以我有一个 class 这样的:
class Instruction{
public:
unsigned int getAddress();
uint32_t getValue();
private:
unsigned int address;
uint32_t value;
}
然后我需要将十进制转换为十六进制并将其写入字符串。我看到 this question 所以我在答案中使用了函数并将其放在我的 Utils.hpp class 中,如下所示:
Utils.hpp
class Utils{
public:
...
static template< typename T > static std::string toHex( T &i );
}
Utils.cpp
template< typename T >
std::string toHex( T &i ){
std::stringstream stream;
stream << "0x" << std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
return stream.str();
}
std::string Utils::toHex<unsigned int>();
std::string Utils::toHex<uint32_t>();
主要我有这个:
std::stringstream stream;
Instruction *newInstruction = new Instruction(addr, inst); // this attributes the parameters
stream << Utils::toHex(newInstruction->getAddress()) << " "
<< Utils::toHex(newInstruction->getValue()) << endl;
我得到以下编译错误:
main.cpp: In function 'int main(int, char**)':
main.cpp:39: error: no matching function for call to 'Utils::toHex(unsigned int)'
Utils.hpp:16: note: candidates are: static std::string Utils::toHex(T&) [with T = unsigned int]
main.cpp:41: error: no matching function for call to Utils::toHex(uint32_t)'
Utils.hpp:16: note: candidates are: static std::string Utils::toHex(T&) [with T = unsigned int]
make: *** [main.o] Error 1
我真的需要帮助来弄清楚如何才能完成这项工作,因为我对这些东西还比较陌生。
提前致谢!
您应该让 toHex
接受 const 对 T
的引用:toHex(const T&)
。否则你不能给它传递一个临时的,而函数调用的结果是一个临时的。
另请注意,您所指的 question/answer 根本无法使用引用,它具有
std::string int_to_hex( T i )
您在函数定义中缺少 Utils::
前缀,并且如前所述,在参考中缺少 const
前缀。更正后的 Utils.cpp 应该是:
template< typename T >
std::string Utils::toHex(const T &i ){
std::stringstream stream;
stream << "0x" << std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
return stream.str();
}
我一直在阅读和阅读提出类似问题的帖子,但我的疑虑仍然存在。
所以我有一个 class 这样的:
class Instruction{
public:
unsigned int getAddress();
uint32_t getValue();
private:
unsigned int address;
uint32_t value;
}
然后我需要将十进制转换为十六进制并将其写入字符串。我看到 this question 所以我在答案中使用了函数并将其放在我的 Utils.hpp class 中,如下所示:
Utils.hpp
class Utils{
public:
...
static template< typename T > static std::string toHex( T &i );
}
Utils.cpp
template< typename T >
std::string toHex( T &i ){
std::stringstream stream;
stream << "0x" << std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
return stream.str();
}
std::string Utils::toHex<unsigned int>();
std::string Utils::toHex<uint32_t>();
主要我有这个:
std::stringstream stream;
Instruction *newInstruction = new Instruction(addr, inst); // this attributes the parameters
stream << Utils::toHex(newInstruction->getAddress()) << " "
<< Utils::toHex(newInstruction->getValue()) << endl;
我得到以下编译错误:
main.cpp: In function 'int main(int, char**)':
main.cpp:39: error: no matching function for call to 'Utils::toHex(unsigned int)'
Utils.hpp:16: note: candidates are: static std::string Utils::toHex(T&) [with T = unsigned int]
main.cpp:41: error: no matching function for call to Utils::toHex(uint32_t)'
Utils.hpp:16: note: candidates are: static std::string Utils::toHex(T&) [with T = unsigned int]
make: *** [main.o] Error 1
我真的需要帮助来弄清楚如何才能完成这项工作,因为我对这些东西还比较陌生。
提前致谢!
您应该让 toHex
接受 const 对 T
的引用:toHex(const T&)
。否则你不能给它传递一个临时的,而函数调用的结果是一个临时的。
另请注意,您所指的 question/answer 根本无法使用引用,它具有
std::string int_to_hex( T i )
您在函数定义中缺少 Utils::
前缀,并且如前所述,在参考中缺少 const
前缀。更正后的 Utils.cpp 应该是:
template< typename T >
std::string Utils::toHex(const T &i ){
std::stringstream stream;
stream << "0x" << std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
return stream.str();
}