2013-03-25 4 views
5

Visual Studio 2012を使用していますが(VC++ 2010ビルドツールを使用しています)、後で別のクラスで呼び出すクラスで定義されたこれら2つのオーバーロードされた関数(下記)最初のクラスをインスタンス化し、クラス:私は、関数呼び出しを行うと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"); 

、それは第二ではない、最初の関数を呼び出します!したがって、2番目の文字列をブール値として扱います。しかし、関数呼び出しに "true"を追加すると、期待通りに2番目の関数が呼び出されます。誰もこれを説明できますか?ありがとう!

答えて

7

文字列リテラル"trigger_pt"のタイプは、 "array of 11 const char"です。コンパイラはboolに変換するほうが、std::stringに変換する方が良いと考えています。なぜなら、boolに変換するのはコンバーターを呼び出す必要があるのに対して、std::stringに変換するのに対して、標準の変換(配列からポインター、次にブールへのポインター)だけを使用するからです。標準の変換シーケンスは、ユーザー定義の変換シーケンス(コンバージョンコンストラクタを含む)よりも常に優れているとみなされます。他の代替はboolよりも優先されますconst char*を取り、別のオーバーロードを提供することである

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

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ことを行うことで、2番目のオーバーロードを使用するように強制することができますバージョン。この過負荷は単にstd::string過負荷に転送することができます。

+1

または、これを自動的にするために 'const char *'を受け入れる第3のオーバーロードを追加してください。 – GManNickG

+1

私はときどき明示的なパラメータ... 'void f(明示的なconst bool b);'を望みます。たぶんC++ 2100? BTW:完全な変換シーケンス[ここ](http://stackoverflow.com/a/15032114/2073257)を検索します。 –

+0

@GManNickGありがとう、私はそれを追加しました。 –

関連する問題