6

我正在使用 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”时,它会按预期调用第二个函数。谁能解释一下?谢谢!

4

1 回答 1

8

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

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

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

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

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

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

于 2013-03-25T19:10:31.057 回答