2013-03-25 75 views
5

我正在使用Visual Studio 2012(但使用VC++ 2010构建工具),并且我有这两个重载的函数(下面的签名)在一个类中定义,我稍后在另一个函数中调用类实例化一流(下文):Visual C++ 2010接受字符串bool重载函数

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”时,它会按预期调用第二个函数。任何人都可以解释吗?谢谢!

回答

7

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

When comparing the basic forms of implicit conversion sequences (as defined in 13.3.3.1)

  • a standard conversion sequence (13.3.3.1.1) is a better conversion sequence than a user-defined conversion sequence or an ellipsis conversion sequence, and
  • [...]

可以迫使它通过使该文字一std::string使用第二过载:

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

另一种方法是提供另一种过载,需要一个const char*,这将是优选的过bool版。这种过载可以简单地转发到std::string过载。

+1

或者添加第三个接受'const char *'的重载,使其自动完成。 – GManNickG 2013-03-25 19:12:57

+1

我有时希望显式参数...'void f(explicit const bool b);'。也许用C++ 2100?顺便说一句:找到完整的转换顺序[这里](http://stackoverflow.com/a/15032114/2073257)。 – 2013-03-25 19:13:51

+0

@GManNickG谢谢,我补充说。 – 2013-03-25 19:14:09