C++ C++;:对成员的请求不明确 #包括 使用名称空间std; c1类{ 公众: void f(){std::cout
问题在于您使用的是指针。您没有调用C++ C++;:对成员的请求不明确 #包括 使用名称空间std; c1类{ 公众: void f(){std::cout,c++,C++,问题在于您使用的是指针。您没有调用c::operator->,只是取消了对未初始化并导致UB的cMain的引用。删除指针(大部分情况下)修复了问题: 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 c
c::operator->
,只是取消了对未初始化并导致UB的cMain的引用。删除指针(大部分情况下)修复了问题:
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类{
公众:
void f(){std::cout如果您不特别需要其他内容的指针语义,可以向c
添加一个重定向到适当基类函数的函数:
#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;
}
模板
c类:公共c1、c2{
公众:
void f(){T::f();}
};
您的呼叫代码相当于
template <typename T>
class c:public c1, c2 {
public:
void f() { T::f(); }
};
c*cMain;
(*cMain.f();//等效于:c cMain;cMain.f();
值*cMain
的类型为c
。显然,现在对f()
的调用是不明确的,因为c1
和c2
都有f()
函数,而c
继承了这两个函数。模板不应该受到责备(可以将类c
设为非模板,并得到相同的结果)
如果你想调用->
操作符,你应该说(*cMain)->f();
,但是不要忘记在之前初始化指针。是不是cMain
应该是指针?你可能想说的是(*cMain)->f()
,但这仍然是UB,因为cMain
未初始化。模板不应该执行t*运算符->({返回静态_cast(this);}
?或者甚至使用T::f;
@Jarod42-对,在使用之前,我就学会了重定向技巧。重新学习新语言很难。:-)假设c1有函数f1,c2有函数f2我如何将c'f'中的函数映射到f1和f2。这两者是什么意思?你想要c.f()
调用这两个函数?您可以执行类似于Bo Persson回答中的操作。我在这里单独问了上述问题,链接如下:
template <typename T>
class c:public c1, c2 {
public:
void f() { T::f(); }
};
c<c1>* cMain;
(*cMain).f(); // equivalent to: c<c1> cMain; cMain.f();