rme*_*dor 3 c++ constructor arguments visual-c++-6
我正在用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;
};
Run Code Online (Sandbox Code Playgroud)
当我使用以下语法实例化此类的实例时: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;
};
Run Code Online (Sandbox Code Playgroud)
Andrew Grant提供了解决方案.我想告诉你为什么它不会像你尝试的那样工作.如果你有两个可行的参数函数,那么调用与参数匹配最好的函数.第二个需要用户定义的转换,而第一个只需要标准转换.这就是为什么编译器首选第一个.