为什么我需要在模板继承中使用范围解析?

Jan*_*roň 3 c++ oop inheritance templates

如果我使用课程,一切都很好:

struct Base1 {
  int value;
  Base1(int value) : value(value) { }
};

struct Test1 : public Base1 {
  int getValue() { return value; }  
  Test1(int value) : Base1(value) { }
};
Run Code Online (Sandbox Code Playgroud)

但是需要模板范围解析:

template <typename T>
struct Base {
  T value;
  Base(T value) : value(value) { }
};

template <typename T>
struct Test : public Base<T> {
  typedef Base<T> parent;
  T getValue() { return parent::value; }  // why do I need to use parent:: here?
  Test(T value) : parent(value) { }
};
Run Code Online (Sandbox Code Playgroud)

没有范围解析我收到错误'value' was not declared in this scope(使用gcc编译器).为什么?

Dav*_*e S 6

因为编译器不知道它value依赖于模板参数.因此,它尝试在第一次传递期间(在实例化模板之前)解决它,并且失败.

这两个选项是使用范围分辨率,如您所拥有或使用this->value.由于this始终是从属名称,因此将强制在第二次传递期间进行评估.

http://ideone.com/07odY

编辑:至于为什么需要完成它:

虽然Test<T>源于Base<T>模板特化可以使Base<std::string>(例如)与正常完全不同Base<T>,并且没有名为成员value,或者它可以是不同类型或任何东西.通过强制它成为依赖名称,编译器必须等到它在检查之前知道所涉及的实际类型.