我正在用MS Visual C++ 6.0编写一个程序(是的,我知道它很古老,没有什么我可以做的升级).我看到一些我认为非常奇怪的行为.我有一个类,有两个构造函数定义如下:
class MyClass { public: explicit MyClass(bool bAbsolute = true, bool bLocation = false) : m_bAbsolute(bAbsolute), m_bLocation(bLocation) { ; } MyClass(const RWCString& strPath, bool bLocation = false); private: bool m_bAbsolute; bool m_bLocation; };
当我使用以下语法实例化此类的实例时:MyClass("blah")
它调用第一个构造函数.正如你所看到的,我添加了explicit
关键字,希望它不会那样做......没有骰子.这样看来,从喜欢转换const char *
到bool
通过转换RWCString
,其中有一个拷贝构造函数,这需要const char *
.为什么这样做?我认为如果有两个可能的选择,就会说这是不明确的.我该怎么做才能阻止它这样做?如果可能的话,我想避免必须明确地将strPath
参数转换为a RWCString
,因为它将与文字一起使用很多,并且这是一个额外的输入(加上一个非常容易犯的错误).
显式在这里没有帮助,因为构造函数不是隐式转换的一部分,只是接收者.
没有办法控制首选的转换顺序,但你可以添加第二个带有const char*的构造函数.例如:
class MyClass { public: MyClass(bool bAbsolute = true, bool bLocation = false); MyClass(const RWCString& strPath, bool bLocation = false); MyClass(const char* strPath, bool bLocation = false); private: bool m_bAbsolute; bool m_bLocation; };
Andrew Grant提供了解决方案.我想告诉你为什么它不会像你尝试的那样工作.如果你有两个可行的参数函数,那么调用与参数匹配最好的函数.第二个需要用户定义的转换,而第一个只需要标准转换.这就是为什么编译器首选第一个.