模板专业化与模板参数

时间:2015-06-12 16:46:35

标签: c++ templates

我最近开始学习c ++。我有时会混淆模板专业化。有人能告诉我No(3)的以下模板专业化是非法的原因吗?

template<typename T>  // No (1)
class ClassA {
public:
    ClassA();
    virtual ~ClassA();

    void func(void);
};

template<>  // No (2)
void ClassA<int>::func(void) {}   // Ok legal specialization

template<typename T>  // No (3)
void ClassA<int>::func(void) {}   // error by compiler

似乎No(3)的模板特化没有隐式模板参数,因为typename T是int。但编译器会出现以下错误,

error: prototype for ‘void ClassA<int>::func()’ does not match any in class ‘ClassA<int>’ void ClassA<int>::func(void) {
                           ^

error: candidate is: void ClassA<T>::func() [with T = int] void func(void);
                          ^

我担心我会问一个愚蠢的问题,但我真的想知道错误的原因。我想知道1号和3号的类型Ts是否相同。请告诉我他们。非常感谢你。

2 个答案:

答案 0 :(得分:2)

(2)是编写专业化的方法。

(1)和(3)中的

T实际上并不相同,你可以写(非专业化):

template <typename U>
void ClassA<U>::func(void) {}

而在(1)中它是T

或部分专门化

template <typename T>
void ClassA<std::vector<T>>::func(void) {}

此处(1)中的T1std::vector<T3>

答案 1 :(得分:0)

而不是

library(DescTools)
fxls<-GetCurrXL()
tttt<-XLGetRange(header=TRUE)

使用

template<typename T>
void ClassA<int>::func(void) {}

我不确定template<typename T> void ClassA<T>::func(void) {} // ^^^ T, not it. 的使用是故意还是监督。