类模板函数模板类型解析中的错误 C2039

error C2039 in class-templates function-template type resolution

提问人:Yaroslav Yamshchikov 提问时间:10/30/2023 更新时间:10/30/2023 访问量:71

问:

为什么 A 肯定是 B 的成员会发生错误?是不是没有更少的一般解决方法?"Error C2039 'T': is not a member of 'B'"

IDE 是 Microsoft Visual Studio Community 2022(64 位)- 当前 版本 17.7.4

重现我的问题的最小示例:

// 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() {
        typedef D::T T1;
        auto f = &(T1::s);
        vector<decltype(f)> v;
        v.push_back(f);
        cout << v.size() << endl;
    }
};

int main()
{
    M<B> m;
    m.set<A>();    
}
C++ 模板 继承

评论


答:

3赞 Ted Lyngmo 10/30/2023 #1
typedef D::T T1;

什么时候会寻找其中不存在。DBTB

由于您还想创建指向成员的指针,因此看起来您想要:s

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

评论

1赞 Yaroslav Yamshchikov 10/30/2023
谢谢。虽然您的解决方案显然适用于我缩短的示例,但它也适用于我的细节:我认为指向基成员函数的指针不适用于派生对象实例,但它确实如此。
0赞 Ted Lyngmo 10/30/2023
@YaroslavYamshchikov 很高兴它有帮助!别客气!