Yin*_*ang 4 c++ templates template-meta-programming
我对奇怪的重复模板遇到以下问题,当我尝试访问 CRTP 基类的数据成员时出现问题。
\n\ntemplate<typename T>\nstruct Base {\n int protectedData=10;\n};\n\nstruct Derived : public Base<Derived> {\npublic:\n void method() {\n std::cout<<protectedData<<std::endl;\n };\n};\n\nint main ()\n{\n Derived a;\n a.method();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n上面的代码编译并运行良好,我可以打印“10”,但如果我有模板化的派生类,例如:
\n\ntemplate<typename T>\nstruct Base {\n int protectedData=10;\n};\n\ntemplate<typename T>\nstruct Derived : public Base<Derived<T> > {\npublic:\n void method() {\n std::cout<<protectedData<<std::endl;\n };\n};\n\nclass A{};\n\nint main ()\n{\n Derived<A> a;\n a.method();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n类 A 只是一个充当模板参数的虚拟类。但编译器抱怨找不到“protectedData”。错误信息如下:
\n\ng++-4.9 test.cc -Wall -std=c++1y -Wconversion -Wextra\ntest.cc: In member function \xe2\x80\x98void Derived<T>::method()\xe2\x80\x99:\ntest.cc:26:11: error: \xe2\x80\x98protectedData\xe2\x80\x99 was not declared in this scope\n cout<<protectedData<<endl;\nRun Code Online (Sandbox Code Playgroud)\n
它实际上与 CRTP 无关,而是与以下事实有关:对于依赖基址访问的派生代码,您需要限定事物。
将行更改为
std::cout<<this->protectedData<<std::endl;
Run Code Online (Sandbox Code Playgroud)
解决了它。
请参阅派生模板类对基类成员数据的访问。
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |