C++模板类调用其他模板类模板成员的编译错误如何解决
错误根因
你遇到的是C++模板两阶段查找规则导致的典型语法错误:
- 类
B继承的A<C>是依赖模板参数C的依赖型基类 - 编译器在第一阶段解析
B的模板代码时,不会查找依赖型基类的内部定义,因此无法判定A<C>::d的成员uffu是一个模板函数 - 此时编译器默认会把
uffu<X>中的<解析为小于运算符,进而触发语法报错 - 你之前尝试添加
::template或.template修饰符没有生效,是因为修饰符的添加位置错误,该修饰符需要紧跟在包含目标模板成员的对象/类名之后。
修复方案
只需要在调用uffu前,给对象d后面加.template修饰符,提示编译器后续是模板函数调用即可,将第27行代码修改为:A<C>::d.template uffu<X>();
修正后完整代码
#include <iostream> #include <string> class D { public: template<class Class> void uffu() { }; }; class X { }; template<class C> class A: public D { public: void print() { std::cout << "a" << std::endl; } D d; }; template<class C> class B: public A<C> { public: void geek() { A<C>::d.template uffu<X>(); // 修复后代码 A<C>::print(); } }; class C: public B<C> { }; int main() { auto c = new C(); c->geek(); delete c; return 0; }
内容的提问来源于stack exchange,提问作者tsschulz
相关产品推荐
相关产品推荐

