You need to enable JavaScript to run this app. C++模板类调用其他模板类模板成员的编译错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 08:15:03