5

テンプレートの推定が間違っているように見えましたが、(b) ではなく (c) が呼び出されるのはなぜですか?

#include <iostream>
using namespace std;
template<class T> void f(T){cout << "f(T)";}//(a)
template<> void f<>(int*){cout << "f(int*)";}//(b)
template<class T> void f(T*){cout << "f(T*)";}//(c)
//void f(int*){cout <<"POD:f(int*)";}//(d)

int main(int argc,char*argv[])
{
    int p = 1;
    f(&p);
    cout <<endl;
    return 0;
}

出力:

f(T*)

4

2 に答える 2

3

わかりました、最初に持っているものをまっすぐにしましょう。

(a) は関数テンプレートです。(b) はその関数テンプレートの特殊化です。(c) は、(a) をオーバーロードする別の関数テンプレートです。

記述する場合f(&p)、考慮すべきオーバーロードが 2 つあります。2 つの関数テンプレート (a) と (c) です。(c)T*は (a) よりも特殊T化されているため、(c) が選択されます。

次に、コメントアウトされた (d) について考えてみましょう。これは関数テンプレート (a) の特殊化ではなく、追加のオーバーロードです。f(&p)この呼び出しを解決するために、考慮すべき 3 つのオーバーロードがあります。(d) はテンプレートではなく、int*のタイプが一致する&pため、他の 2 つよりも選択されます。

于 2013-06-12T07:34:54.113 に答える
0

テンプレートの特殊化は、テンプレートの後に来る必要があります。ここで、あなたの場合、次のようになります。

template<class T> void f(T){cout << "f(T)";}//(a) // Template 1
template<> void f<>(int*){cout << "f(int*)";}//(b) // Specialization of template 1
template<class T> void f(T*){cout << "f(T*)";}//(c) // Template 2, conceals template 1

したがって、テンプレート 2 がインスタンス化されます。正しい方法は次のとおりです。

template<class T> void f(T*){cout << "f(T*)";} // Template 1
template<class T> void f(T){cout << "f(T)";} // Template 2
template<> void f<>(int*){cout << "f(int*)";} // Specialization of the template 1

出力:

f(int*)
于 2013-06-12T07:40:15.840 に答える