6

Visual Studio 2012を使用しています(ただし、VC ++ 2010ビルドツールを使用しています)。クラスで定義されたこれらの2つのオーバーロードされた関数(以下の署名)があり、後で最初のクラス(以下も参照)をインスタンス化する別のクラスで呼び出します。

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番目ではなく、最初の関数が呼び出されます。したがって、2番目の文字列はブール値として扱われます。ただし、関数呼び出しに「true」を追加すると、期待どおりに2番目の関数が呼び出されます。誰かがこれを説明できますか?ありがとう!

4

1 に答える 1

8

文字列リテラル"trigger_pt"のタイプは「arrayof11 const char」です。コンパイラは、これをに変換するboolよりも、に変換する方がよいと考えていstd::stringます。その理由は、への変換boolでは標準の変換(配列からポインター、次にブールへのポインター)のみが使用されるのに対し、への変換でstd::stringはコンストラクターを呼び出す必要があるためです。標準の変換シーケンスは、ユーザー定義の変換シーケンス(変換コンストラクターを含む)よりも常に優れていると見なされます。

暗黙の変換シーケンスの基本形式を比較する場合(13.3.3.1で定義)

  • 標準の変換シーケンス(13.3.3.1.1)は、ユーザー定義の変換シーケンスや省略記号の変換シーケンスよりも優れた変換シーケンスであり、
  • [...]

std::stringそのリテラルを:にすることで、2番目のオーバーロードを使用するように強制できます。

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

もう1つの方法は、を使用する別のオーバーロードを提供することです。const char*これは、バージョンよりも優先されboolます。この過負荷は、単に過負荷に転送できますstd::string

于 2013-03-25T19:10:31.057 に答える