gpt4 book ai didi

C++:成员请求不明确

转载 作者:搜寻专家 更新时间:2023-10-31 00:28:16 25 4
gpt4 key购买 nike

#include <iostream>
using namespace std;
class c1{
public:
void f(){std::cout<<"In f1\n";}
};
class c2{
public:
void f(){std::cout<<"In f2\n";}
};

template <typename T>
class c:public c1, c2 {
T* pT;
public:
T* operator->() { return pT; }
};

int main()
{
c<c1>* cMain;
cMain->f();
return 0;
}

错误:

g++ cache.cc
cache.cc: In function ‘int main()’:
cache.cc:22:8: error: request for member ‘f’ is ambiguous
cMain->f();
^
cache.cc:9:8: note: candidates are: void c2::f()
void f(){std::cout<<"In f2\n";}
^
cache.cc:5:8: note: void c1::f()
void f(){std::cout<<"In f1\n";}

为什么它没有访问模板中指定的c1的函数f?我的模板用法有误吗?我怎样才能使用模板让它指向所需的类?

最佳答案

问题是您使用的是指针。您不是调用 c::operator-> 而是取消引用 cMain ,它未初始化并导致 UB。删除指针(大部分)可以解决问题:

#include <iostream>

class c1{
public:
void f(){std::cout<<"In f1\n";}
};
class c2{
public:
void f(){std::cout<<"In f2\n";}
};

template <typename T>
class c { // No longer derives from c1 and c2
T t; // No longer a pointer
public:
T* operator->() { return &t; }
};

int main()
{
c<c1> cMain; // No longer a pointer
cMain->f(); // Calls c::operator->() now
return 0;
}

see it work

当然,您不需要 cc1c2(或其他任何东西)派生来工作。

关于C++:成员请求不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45840448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com