Sim*_*ann 0 c++ methods templates pass-by-reference
我目前正在努力获得以下代码进行编译.首先是包含带有方法模板的类的头文件:
// ConfigurationContext.h
class ConfigurationContext
{
public:
template<typename T> T getValue(const std::string& name, T& default) const
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
在其他地方,我想这样称呼这个方法:
int value = context.getValue<int>("foo", 5);
Run Code Online (Sandbox Code Playgroud)
在那里我收到以下错误:
error: no matching function for call to 'ConfigurationContext::getValue(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int)'
Run Code Online (Sandbox Code Playgroud)
我检查了明显的错误,比如丢失包含和类似的东西.但一切似乎都是正确的.我尝试删除模板类型参数的pass-by-reference,如下所示:
template<typename T> T getValue(const std::string& name, T default) const ...
Run Code Online (Sandbox Code Playgroud)
然后它编译没有任何错误,也运行良好,但我仍然想在这里传递一个参考...
有谁知道这里发生了什么以及如何使这项工作?
5是一个文字,你不能将文字绑定到非const引用.任取T每份或每const参考:
template<typename T> T getValue(const std::string& name, const T& def) const
Run Code Online (Sandbox Code Playgroud)
(顺便说一下,我怀疑你的编译器是否接受T default,因为它default是一个关键字,不能用作标识符.)
你不能这样做的原因是因为每个非const引用获取参数通常意味着被调用者可能会改变该值,并且这些更改应该反映在调用者的位置.(请参阅如何将对象传递给C++中的函数?)但是,您无法更改文字或临时文本.因此,您不能将它们传递给非const引用.