可能重复:
Where and why do I have to put the “template” and “typename” keywords?
我遇到了一段奇怪的代码:
#include <iostream>
template <int N>
struct Collection {
int data[N];
Collection() {
for(int i = 0; i < N; ++i) {
data[i] = 0;
}
};
void SetValue(int v) {
for(int i = 0; i < N; ++i) {
data[i] = v;
}
};
template <int I>
int GetValue(void) const {
return data[I];
};
};
template <int N, int I>
void printElement(Collection<N> const & c) {
std::cout << c.template GetValue<I>() << std::endl; /// doesn't compile without ".template"
}
int main() {
Collection<10> myc;
myc.SetValue(5);
printElement<10, 2>(myc);
return 0;
}
printElement 函数中未使用 .template 关键字进行编译。我以前从未见过这个,我不明白需要什么。试图删除它,我得到了很多与模板相关的编译错误。所以我的问题是何时使用这种结构?这很常见吗?
答案 0 :(得分:55)
GetValue
是一个从属名称,因此您需要明确告诉编译器c
后面的内容是函数模板,而不是某些成员数据。这就是为什么你需要写template
关键字来消除歧义。
没有template
关键字,以下
c.GetValue<I>() //without template keyword
可以解释为:
//GetValue is interpreted as member data, comparing it with I, using < operator
((c.GetValue) < I) > () //attempting to make it a boolean expression
即,<
被解释为小于运算符,>
被解释为大于运算符。上述解释当然是不正确的,因为它没有意义,因此会导致编译错误。
有关详细说明,请阅读此处接受的答案: