模板化派生类时访问基本成员数据错误

时间:2015-06-19 06:00:09

标签: c++ templates template-meta-programming

我对奇怪的重复模板有以下问题,当我尝试访问CRTP基类的数据成员时出现问题。

template<typename T>
struct Base {
  int protectedData=10;
};

struct Derived : public Base<Derived> {
public:
  void method() {
    std::cout<<protectedData<<std::endl;
  };
};

int main ()
{
  Derived a;
  a.method();
}

上面的代码编译并运行正常,我可以打印“10”,但如果我有衍生类模板,如:

template<typename T>
struct Base {
  int protectedData=10;
};

template<typename T>
struct Derived : public Base<Derived<T> > {
public:
  void method() {
    std::cout<<protectedData<<std::endl;
  };
};

class A{};

int main ()
{
  Derived<A> a;
  a.method();
}

A类只是一个用作模板参数的虚拟类。但编译器抱怨无法找到“protectedData”。错误信息如下:

g++-4.9 test.cc -Wall -std=c++1y -Wconversion -Wextra
test.cc: In member function ‘void Derived<T>::method()’:
test.cc:26:11: error: ‘protectedData’ was not declared in this scope
    cout<<protectedData<<endl;

1 个答案:

答案 0 :(得分:1)

它与CRTP没有任何关系,而是因为对于依赖于base的访问派生代码,你需要对事物进行限定。

将行更改为

std::cout<<this->protectedData<<std::endl;

解决了它。

请参阅accessing a base class member in derived class