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++ 原始字符串文字?
microsoft visual c++6.0和micorostf visual c++ 2010 express有啥区别