我最近开始学习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是否相同。请告诉我他们。非常感谢你。
答案 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)中的T1
为std::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.
的使用是故意还是监督。