我最近遇到了一个使用C ++ 03的非常讨厌的问题。
我需要创建一个新的字符串类,扩展std::string
的能力,提供更多方法和更方便的处理。
一切顺利,除了一个问题:如果某个函数需要一个MyString
参数并且给出一个字符串文字(即"Hello"
),它就无法从const char[6]
转换为{{ 1}},尽管MyString
有一个接受MyString
的c'tor。
例如,这些行将起作用:
std::string
但是这段代码不起作用:
MyString mStr("Hello");
MyString mStr = "Hello";
因为void myFunc(const MyString& mStr);
myFunc("Hello");
。
添加接受"no constructor exists that can perform the conversion from const char[6] into MyString"
的c'tor并没有帮助解决问题,甚至尝试用不同组合的const char *
标记它们也没有任何帮助。
在这个错误上花了好几个小时之后,我得出的结论是,可能无法做这样的事情,因为它可能需要两次隐式转换,编译器将无法执行,但正如我所说,添加一个来自explicit
的c'tor在一步中启用转换并未改变任何内容。所以在我放弃这个之前,如果有可能解决这个问题,你们中有没有人有任何想法?
答案 0 :(得分:2)
对于MyString
的{{1}}构造函数,编译器无法从std::string const&
到const char*
转换为std::string
,以便致电MyString
,因为这是两次隐式转化,而它只能做一次。请参阅this post。
如果myFunc
是参数,I could not reproduce your erorrs。另外,构造函数const char*
在这里不会有任何好处,它甚至会禁止一个允许的隐式转换。 See it here
答案 1 :(得分:0)
使用参数“const char *”(MyString(const char *)) 定义构造函数应该可以解决这个问题。