早上好:情况如下
.h文件
extern const std::string void_string_;
extern const int zero_int;
template <typename Class>
inline const Class& zero()
{
// an error message
}
template <>
inline const int& zero<int>()
{
return zero_int;
}
template <>
inline const std::string& zero<std::string>()
{
return void_string_;
}
.cpp文件
const std::string void_string_="";
const int zero_int=0;
然后我使用
调用这两个函数zero<int>()
zero<string>()
现在,编译器给我一个警告
zero<int>()
Warning: returning reference to temporary
好的,我知道,理论上,为什么我会收到警告:当我使用临时引用时。没关系。 我仍然不明白为什么 const int zero_int; 被认为是暂时的。
感谢您的任何澄清。
修改:根据评论中的建议,我编辑了 Class&amp;零模板。虽然最初我不能包含错误代码(因为错误消息是一个函数),我清理它以在此处发布并有效地在过程中我理解错误的原因。 具体来说:
template <typename Class>
inline const Class& zero()
{
std::cout << "No!" << std::endl; // substitutes the original error message
return zero_int;
}
在代码行中发生错误,我调用
zero<long long int>()
有效地创造了一个临时的。尝试:
template <typename Class>
inline const Class& zero()
{
std::cout << "No!" << std::endl; // substitutes the original error message
return (Class&)zero_int;
}
删除警告,但显然会给另一个小小的&#39;问题(即:结果不是0,而是一些随机数,可能与程序读取的其他字节有关)
此时我唯一的改变就是离开Class&amp;零()未定义。
template <typename Class>
inline const Class& zero(); // left undefined by purpose
以这种方式获得完整错误,例如:
undefined reference to `long long const& zero<long long>()'
当我必须定义正确的专业化时,它会提醒我。
感谢您指出我正确的方向。