6

(この質問では、 Abrahams/Dimov の例に関する知識があると想定しています。)

次のようなサードパーティ コードがヘッダーに含まれているとします。これは変更できません。

template<class T> void f(T);    // (1) base template 1
template<class T> void f(T *);  // (2) base template 2
template<> void f<>(int *);     // (3) specialization of (2)

質問は:

上記の宣言がそのまま与えられている場合、 (たとえば)の場合にベース テンプレート 1 を特殊化することは可能ですか?T = int *

または、ベース テンプレート 2 の単なる宣言は、ベース テンプレート 1 を (少なくともポインターに対して) 特殊化できなくなったことを意味しますか?

4

2 に答える 2

2

関数名の後の山かっこにテンプレート パラメーターを明示的に指定することで、(1) をオーバーロードできます (cf. C++11-Standard 14.7.3)。

#include <iostream>
using namespace std;
template<class T> void f(T)    // (1) base template 1
{
    cout << "template<class T> void f(T)" << endl;
}

template<class T> void f(T *)  // (2) base template 2
{
    cout << "template<class T> void f(T *)" << endl;
}
//template<> void f<>(int *);     // (3) specialization of (2)

template<> void f<int*>(int *)     // (4) specialization of (1)
{
    cout << "f<int*>(int *)" << endl;
}


int main() {
    int i;
    f(&i); // calls (2) since only base-templates take part in overload resolution
    return 0;
}
于 2014-01-27T07:16:13.570 に答える
0

あなたはいつでも試してみて、私たちに来ることができます. しかし、なぜそれが機能しないのかわかりません。T = int*思い通りに動くなら。したがって、2 は次のパラメータにはなりません。int* *

于 2013-02-09T07:44:36.427 に答える