关于C++:模板(点模板)的构造用法

.template (dot-template) construction usage

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Where and why do I have to put the “template” and “typename” keywords?

我遇到了一段奇怪的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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() << std::endl; /// doesn't compile without".template"
}

int main() {
  Collection<10> myc;
  myc.SetValue(5);
  printElement<10, 2>(myc);
  return 0;
}

未在printElement函数中使用.template关键字编译它。我以前从未见过这种情况,我不明白需要什么。尝试删除它时,我遇到了很多与模板相关的编译错误。所以我的问题是什么时候使用这种结构?常见吗?


GetValue是一个依赖名称,因此需要明确地告诉编译器,c后面的是函数模板,而不是一些成员数据。这就是为什么您需要编写template关键字来消除这种歧义。

没有template关键字,以下

1
c.GetValue()  //without template keyword

可以解释为:

1
2
//GetValue is interpreted as member data, comparing it with I, using < operator
((c.GetValue) < I) > () //attempting to make it a boolean expression

也就是说,<被解释为小于运算符,>被解释为大于运算符。当然,上述解释是不正确的,因为它没有意义,因此会导致编译错误。

有关详细解释,请阅读以下接受的答案:

  • 我为什么要把"模板"和"类型名"关键字放在哪里?