提问人:Yaroslav Yamshchikov 提问时间:10/30/2023 更新时间:10/30/2023 访问量:71
类模板函数模板类型解析中的错误 C2039
error C2039 in class-templates function-template type resolution
问:
为什么 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>();
}
答:
3赞
Ted Lyngmo
10/30/2023
#1
typedef D::T T1;
什么时候会寻找其中不存在。D
B
T
B
由于您还想创建指向成员的指针,因此看起来您想要:s
typedef T T1;
auto f = &T1::s;
评论
1赞
Yaroslav Yamshchikov
10/30/2023
谢谢。虽然您的解决方案显然适用于我缩短的示例,但它也适用于我的细节:我认为指向基成员函数的指针不适用于派生对象实例,但它确实如此。
0赞
Ted Lyngmo
10/30/2023
@YaroslavYamshchikov 很高兴它有帮助!别客气!
评论