2

次のコードでは、より具体的な SomeClass ベースの関数ではなく、ジェネリック関数が呼び出されるのはなぜですか?

template <typename T>
class SomeClass
{
};

template <typename T>
void foo(T)
{
   std::cout << "foo() Generic - Undesired function\n";
}

template <typename T>
void foo(const SomeClass<T>*)
{
   std::cout << "foo() SomeClass<T> - Desired function\n";
}


int main()
{
   SomeClass<char>* sc = new SomeClass<char>();
   foo(sc);
   return 0;
}

注: " void foo(const SomeClass<T>*)" 定義から const を削除すると、目的の関数が呼び出されます。影響はありませんでしたが、fooの再配置も試みました。可能であれば、この特定の ADL シナリオを説明する標準の関連領域を参照してください。

const あり: http://ideone.com/DIchLl

const なし: http://ideone.com/Iam4LV

const あり (1st): http://ideone.com/W6PoJw

4

2 に答える 2

2

ないものconstは変換が少なくて済むからです。コンパイラがオーバーロードを選択するとき、最初に正確に一致するものを探し、次に特定の順序で一連の変換を行い、最初に見つかったものが使用されます。

この例でscは、SomeClass<char>*&です。コンパイラは最初に完全一致を試みますが、一致がないため、&. 1 つが見つかったので、検索を終了し、もう 1 つconstを表示できるようにする を追加しません。

于 2013-01-21T02:46:54.363 に答える
2

foo(T)T=の引数と完全に一致しますSomeClass<T>*

foo(const SomeClass<T>*)修飾子の変換が必要です (const修飾子を追加するため)。

完全一致は、たとえ修飾変換であっても、何らかの変換を必要とする一致よりも優れています。

于 2013-01-21T02:47:24.887 に答える