我的代码很简单。
template<typename T>
class NamedObject{
public:
NamedObject(std::string& name, const T& value):nameValue(name), objectValue(value)
{
}
private:
std::string& nameValue;
const T objectValue;
};
int main(int argc, char* argv[])
{
NamedObject<int> no1("Smallest Prime Number",2);//error
NamedObject<int> no2(std::string("Smalledst Prime Number"),2);//works
return 0;
}
当我将第一个参数作为非参考时,将创建no1和no2对象。但是当我保持引用Visual Studio编译器给出以下错误时,
错误1错误C2664:'NamedObject :: NamedObject(std :: string&amp;,const T&amp;)':无法将参数1从'const char [22]'转换为 'std :: string&amp;' c:\ users \ pkothari \ documents \ visual studio 2008 \ projects \ stackoflw \ stackoflw \ stackoflw.cpp 36
如果char *可以转换为std :: string,为什么不转换为std :: string&amp; ?有没有办法让它发挥作用?
答案 0 :(得分:1)
NamedObject<int> no2(std::string("Smalledst Prime Number"),2);//works
这不适用于符合标准的编译器。它在MS Visual Studio C ++中受支持,即使它不是标准的C ++。
当预期参数为std::string&
时,以下任何一个调用都不起作用。
NamedObject<int> no1("Smallest Prime Number",2);
NamedObject<int> no2(std::string("Smalledst Prime Number"),2);
当参数类型为std::string
或std::string const&
时,它们都应该有用。