模板化派生 class 时访问基本成员数据错误
Accessing base member data error when derived class is templated
我在使用奇怪的重复模板时遇到以下问题,当我尝试访问 CRTP 基础 class 的数据成员时出现问题。
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”,但是如果我有派生的 class 模板,比如:
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();
}
class A 只是一个虚拟 class 作为模板参数。但是编译器抱怨找不到 "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;
它实际上与 CRTP 无关,而是与以下事实有关:对于依赖基访问的派生代码,您需要限定一些东西。
将行更改为
std::cout<<this->protectedData<<std::endl;
解决了。
参见accessing a base class member in derived class。
我在使用奇怪的重复模板时遇到以下问题,当我尝试访问 CRTP 基础 class 的数据成员时出现问题。
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”,但是如果我有派生的 class 模板,比如:
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();
}
class A 只是一个虚拟 class 作为模板参数。但是编译器抱怨找不到 "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;
它实际上与 CRTP 无关,而是与以下事实有关:对于依赖基访问的派生代码,您需要限定一些东西。
将行更改为
std::cout<<this->protectedData<<std::endl;
解决了。
参见accessing a base class member in derived class。