Visual C++ 2010 接受字符串作为重载函数中的 bool

Posted

技术标签:

【中文标题】Visual C++ 2010 接受字符串作为重载函数中的 bool【英文标题】:Visual C++ 2010 accepts string for bool in overloaded function 【发布时间】:2013-03-25 19:07:05 【问题描述】:

我正在使用 Visual Studio 2012(但使用 VC++ 2010 构建工具),并且我在一个类中定义了这两个重载函数(下面的签名),我稍后在另一个实例化第一个类的类中调用它(也在下面) :

Defined in the class:
Node CreateNode(Node *parent,string name,string node_text,bool expects_node = true);
Node CreateNode(Node *parent,string name, string attribute, string value,bool expects_node = true)

Calling these functions in the macro:
Node axis1 = handler->CreateNode(&sparse,"axis","id","trigger_pt");

当我调用函数时,它调用的是第一个函数,而不是第二个!所以它将第二个字符串视为布尔值!但是,当我在函数调用中添加“true”时,它会按预期调用第二个函数。谁能解释一下?谢谢!

【问题讨论】:

【参考方案1】:

字符串文字"trigger_pt" 的类型为“array of 11 const char”。编译器认为将其转换为bool 比将其转换为std::string 更好。原因是因为转换为bool 只使用标准转换(数组到指针,然后是布尔指针),而转换为std::string 需要调用构造函数。标准转换序列总是被认为比用户定义的转换序列(涉及转换构造函数)更好。

比较隐式转换序列的基本形式时(定义见 13.3.3.1)

标准转换序列 (13.3.3.1.1) 是比用户定义的转换序列或省略号转换序列更好的转换序列,并且 [...]

您可以通过将该文字设为std::string 来强制它使用第二个重载:

Node axis1 = handler->CreateNode(&sparse,"axis","id",std::string("trigger_pt"));

另一种选择是提供另一个采用const char* 的重载,这将优于bool 版本。这个重载可以简单地转发到std::string重载。

【讨论】:

或添加第三个接受const char* 的重载,以使其自动完成。 我有时希望显式参数...void f( explicit const bool b );。也许使用 C++2100? BTW:找到完整的转换序列here。 @GManNickG 谢谢,我补充了。 很好的答案,我从来不知道这个!我尝试了您的第一个建议并找到了问题的根源,因为我收到以下错误:无法将参数 4 从 'std::basic_string<_elem>' 转换为 'bool' 我不知道它是否是我需要设置的选项,或者如果 VS 就是这种方式,但它不允许我调用缺少可选参数的成员函数(从作为解决方案的一部分的类)。所以这就是为什么它默认使用 4 个参数来运行......我想从现在开始我将使用 const char*。

以上是关于Visual C++ 2010 接受字符串作为重载函数中的 bool的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VIsual C++ 2010 中实现 C++ 原始字符串文字?

如何在 Visual C++ 2010 中打开资源字符串?

microsoft visual c++6.0和micorostf visual c++ 2010 express有啥区别

vfptr 中的 Visual C++ 方法以相反的顺序

接口的重载方法不能接受联合类型:“没有重载匹配此调用”

Visual Studio 2010:扩展/差异