gpt4 book ai didi

c++ - 从通用基类继承多次时的歧义调用

转载 作者:行者123 更新时间:2023-12-02 10:11:31 25 4
gpt4 key购买 nike

我想克隆一个包含几种类型的std::list的数据结构,并同时移动一些迭代器以指向新的std::list的元素。为此,我创建了一个通用类型Translate<T>,它表示从旧列表中的std::list<T>::iterator到新列表中的映射的映射。然后,对于我的数据结构的所有需要​​的类型Translate<T>,我都有一个从T继承的新类。
这是一个简化的示例(仅使用身份函数):

#include <list>

struct T1 {};
struct T2 {};

template<typename T>
class Translate {
public:
typename std::list<T>::iterator operator()(typename std::list<T>::iterator x) {
return x; // more complex in the real world, but doesn't matter here
}
};

int main() {
std::list<T1> l1{};
std::list<T2> l2{};

class : public Translate<T1>, public Translate<T2> {} tr;
tr(l1.begin());
}
这给了我下面的编译器错误:
mwe.cpp: In function ‘int main()’:
mwe.cpp:19:15: error: request for member ‘operator()’ is ambiguous
tr(l1.begin());
^
mwe.cpp:9:34: note: candidates are: ‘typename std::__cxx11::list<T>::iterator Translate<T>::operator()(typename std::__cxx11::list<T>::iterator) [with T = T2; typename std::__cxx11::list<T>::iterator = std::_List_iterator<T2>]’
typename std::list<T>::iterator operator()(typename std::list<T>::iterator x) {
^~~~~~~~
mwe.cpp:9:34: note: ‘typename std::__cxx11::list<T>::iterator Translate<T>::operator()(typename std::__cxx11::list<T>::iterator) [with T = T1; typename std::__cxx11::list<T>::iterator = std::_List_iterator<T1>]’
通话是用什么方式模棱两可的? std::list<T>::iterator不能相互转换。
如果我将每个T的实现手动复制到子类中,它将起作用,但这正是使用泛型和继承时要避免的。

最佳答案

该代码格式错误。如果派生类中没有operator(),则名称查找仅在存在一个基类的情况下才考虑基类。如果存在多个基类,则名称查找中将不考虑任何基类。
正如您已经提到的,您可以将operator()的实现复制到派生类中,并且可以正常工作,但是您也可以使用operator()指令将这两个using名称都带到派生类中,如下所示:

class : public Translate<T1>, public Translate<T2> {
public:
using Translate<T1>::operator();
using Translate<T2>::operator();
} tr;
这是 demo

关于c++ - 从通用基类继承多次时的歧义调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63359359/

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