C++:成员请求不明确

标签 c++

#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

当然,您不需要从 c1c2(或任何内容)派生 c 来实现此功能。

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

相关文章:

c++ - QImage 到 QPixmap 是昂贵的

c++ - 如何执行从 char* 缓冲区加载到内存中的代码?

c++ - 读取 "\n"字符串并写入文本文件?

c++ - CNG 中的 AES-CBC 加密输出与在线工具不匹配

c++ - 将 std::ostream 转换为 std::string

c++ - 迭代器元组。运算符++的实现

c++ - 为什么我的性能基准会给我错误的结果?

c++ - 为什么相应成员不能正确访问成员函数指针?

c++ - LIBC 的 mktime 函数对相同的输入返回不同的值

c++ - std、boost 或其他具有隐式键的哈希表容器的广泛实现