You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2022下C2039错误:A是B的成员却提示'T'非B成员,求简便解法

错误C2039: 'T': is not a member of 'B' 的原因与解决方法

错误原因

你代码里的问题出在这一行:

typedef D::T T1;
  1. 类B是从A虚继承,但基类不会自动成为派生类的嵌套类型,B中并没有名为A的成员类型,所以D::T(也就是B::A)的写法完全不成立,编译器自然会报错说T不是B的成员。
  2. 退一步说,就算是嵌套类型,在模板语境里也需要用typename关键字声明它是类型,但这里的核心问题是你根本没必要通过D来访问T——T本身就是set函数的模板参数,直接用它就行。

解决方法

最简的修改就是删掉错误的typedef D::T T1;,直接使用模板参数T:

修正后的完整代码

// reproduce_2039.cpp
//

#include <iostream>
#include <vector>
using namespace std;

class A {
public:
    void s(){
        cout << "a::s()" << endl;
    }
};

class B : public virtual A {

};

template<typename D>
class M {
public:
    template<typename T>
    void set() {
        auto f = &(T::s); // 直接使用模板参数T
        vector<decltype(f)> v;
        v.push_back(f);
        cout << v.size() << endl;
    }
};

int main()
{
    M<B> m;
    m.set<A>();    
}

如果一定要保留typedef的写法,改成下面这样也可以:

typedef T T1;
auto f = &(T1::s);

内容的提问来源于stack exchange,提问作者Yaroslav Yamshchikov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:17:16