0

重複の可能性:
テンプレート関数と非テンプレート関数の呼び出し順序

このコード コードが出力される理由

::foo(int)
::foo<T>(T)

 

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

template <typename T>
void bar(T baz)
{
   foo(baz);
}

void foo(int)
{
   std::cout << "::foo(int) \n";
}

int main()
{
   foo(0);
   bar(0); 
}

この間

void foo(int)
{
   std::cout << "::foo(int) \n";
}

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

template <typename T>
void bar(T baz)
{
   foo(baz);
}

int main()
{
   foo(0);
   bar(0); 
}

版画

::foo(int)
::foo(int)

予想通り。

4

1 に答える 1

4

その理由は、テンプレート関数は、インスタンス化の時点で可視の関数ではなく、定義の時点で可視の関数のみを考慮するためです。インスタンス化の可視性に基づいて関数を選択した場合、左右の 1 つの定義規則に違反する可能性が高くなります。関連する質問への私の回答には、後でテンプレート関数の特殊化を追加する標準的な参照があります

于 2012-08-29T18:07:53.297 に答える