调用函数时首选错误的参数转换

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,因为它将与文字一起使用很多,并且这是一个额外的输入(加上一个非常容易犯的错误).

And*_*ant 9

显式在这里没有帮助,因为构造函数不是隐式转换的一部分,只是接收者.

没有办法控制首选的转换顺序,但你可以添加第二个带有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)


Joh*_*itb 6

Andrew Grant提供了解决方案.我想告诉你为什么它不会像你尝试的那样工作.如果你有两个可行的参数函数,那么调用与参数匹配最好的函数.第二个需要用户定义的转换,而第一个只需要标准转换.这就是为什么编译器首选第一个.