6

(我假设了解此问题中的Abrahams/Dimov 示例。)

假设在这样的标头中有一些第 3 方代码,您无法修改:

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)

问题是:

如果我已按原样获得上述声明,我现在是否可以T = int *针对(例如)的情况专门化基本模板 1 ?

或者仅仅声明基本模板 2 是否意味着基本模板 1 不能再被专门化(至少对于指针而言)?

4

2 回答 2

2

您可以通过在函数名称后的尖括号中显式指定模板参数来重载 (1)(参见 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 回答