#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;
}
当然,您不需要从 c1
和 c2
(或任何内容)派生 c
来实现此功能。
关于C++:成员请求不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45840448/