VS2022下C2039错误:A是B的成员却提示'T'非B成员,求简便解法
错误C2039: 'T': is not a member of 'B' 的原因与解决方法
错误原因
你代码里的问题出在这一行:
typedef D::T T1;
- 类B是从A虚继承,但基类不会自动成为派生类的嵌套类型,B中并没有名为
A的成员类型,所以D::T(也就是B::A)的写法完全不成立,编译器自然会报错说T不是B的成员。 - 退一步说,就算是嵌套类型,在模板语境里也需要用
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
相关产品推荐
相关产品推荐

