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();