Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多重继承模板类 class messageA{ }; 类消息B{ }; 模板 类队列{ 公众: 虚拟~queue(){} 无效提交(T&x){} }; A类:公共队列,公共队列 { }; int main() { A aa; aa.提交(messageA()); aa.提交(messageB()); }_C++_Multiple Inheritance_Ambiguous_Name Lookup_Class Members - Fatal编程技术网

C++ 多重继承模板类 class messageA{ }; 类消息B{ }; 模板 类队列{ 公众: 虚拟~queue(){} 无效提交(T&x){} }; A类:公共队列,公共队列 { }; int main() { A aa; aa.提交(messageA()); aa.提交(messageB()); }

C++ 多重继承模板类 class messageA{ }; 类消息B{ }; 模板 类队列{ 公众: 虚拟~queue(){} 无效提交(T&x){} }; A类:公共队列,公共队列 { }; int main() { A aa; aa.提交(messageA()); aa.提交(messageB()); },c++,multiple-inheritance,ambiguous,name-lookup,class-members,C++,Multiple Inheritance,Ambiguous,Name Lookup,Class Members,我的第一个想法是,上面的代码应该很好,因为类A将包含2个重载提交函数,它们将接受messageA和messageB对象 但是,编译器给了我以下错误: 我可以知道为什么有一个模棱两可的名字吗?对于第一次提交调用,我想调用messageA版本,这不是很明显吗?对于第二次提交呼叫,我想呼叫messageB版本 ----构建已启动:项目:主,配置:发布Win32------ 编译。。。 main.cpp .\main.cpp(21):错误C2385:对“提交”的访问不明确 可能是基本“队列”中的“提交

我的第一个想法是,上面的代码应该很好,因为类A将包含2个重载提交函数,它们将接受messageA和messageB对象

但是,编译器给了我以下错误:

我可以知道为什么有一个模棱两可的名字吗?对于第一次提交调用,我想调用messageA版本,这不是很明显吗?对于第二次提交呼叫,我想呼叫messageB版本


----构建已启动:项目:主,配置:发布Win32------
编译。。。
main.cpp
.\main.cpp(21):错误C2385:对“提交”的访问不明确
可能是基本“队列”中的“提交”
或者可以是基本“队列”中的“提交”
.\main.cpp(21):错误C3861:“提交”:找不到标识符
.\main.cpp(22):错误C2385:对“提交”的访问不明确
可能是基本“队列”中的“提交”
或者可以是基本“队列”中的“提交”
.\main.cpp(22):错误C2664:“队列::提交”:无法将参数1从“messageB”转换为“messageA&”
具有
[
T=a
]
.\main.cpp(22):错误C3861:“提交”:找不到标识符

我现在没有编译器,但我想一个继承可能会隐藏另一个:编译器将使用它来查找正确的符号,如果我没记错的话,一旦编译器找到合适的符号(即,一个名为“submit”的方法),它将停止在父范围和/或外部范围中搜索其他符号

在这种情况下,我认为两个继承类都会被搜索符号,但是没有你的精确编译器(Visual C++ 2003?2008?2010),我猜不到更多。 经过一些思考,另一种可能是编译器确实找到了这两个符号,但无法决定调用哪一个(在符号解析时,编译器只关心符号名称,而不关心其确切原型)。我相信最后的解释是正确的

尝试在派生类中使用语句添加:

------ Build started: Project: main, Configuration: Release Win32 ------
Compiling...
main.cpp
.\main.cpp(21) : error C2385: ambiguous access of 'submit'
        could be the 'submit' in base 'queue<messageA>'
        or could be the 'submit' in base 'queue<messageB>'
.\main.cpp(21) : error C3861: 'submit': identifier not found
.\main.cpp(22) : error C2385: ambiguous access of 'submit'
        could be the 'submit' in base 'queue<messageA>'
        or could be the 'submit' in base 'queue<messageB>'
.\main.cpp(22) : error C2664: 'queue<T>::submit' : cannot convert parameter 1 from 'messageB' to 'messageA &'
        with
        [
            T=messageA
        ]
.\main.cpp(22) : error C3861: 'submit': identifier not found
可以帮助编译(这可以解释第22行的编译器错误)

或者您可以将submit方法的原型更改为接受常量引用而不是非常量引用

注意:仍然没有编译器,所以尝试用大脑调试代码…:-P…

Something*smth1=((Base*)d)->createBase();
int main()
{
    A aa;
    messageA mA ;
    messageA mB ;
    aa.submit(mA);
    aa.submit(mB);
}

<>上述代码工作正常。

注意,从<代码> MasaGeA<代码>到 MasaGea/<代码>的隐式转换不是标准C++;非常量引用只能绑定到左值()。
submit()
函数应该接受
const T&
而不是
T&
“我想一个继承可能会隐藏另一个”否。“编译器将使用Koenig查找”不,不会。编译器确实找到了这两个符号,但无法决定调用哪个“是”。临时变量(因此,常量r值)。“不,临时变量不是常量。”
((Base*)d)
“丑陋且非常危险:使用此C样式转换将隐藏严重的类型问题。OTOH,这
Base&dBase=*d;createBase()是安全的。
class A : public queue<messageA>, public queue<messageB>
{
   using queue<messageA>::submit ;
   using queue<messageB>::submit ;
} ;
int main()
{
    A aa;
    messageA mA ;
    messageA mB ;
    aa.submit(mA);
    aa.submit(mB);
}
Something* smth1 = ((Base<Something> *)d)->createBase<Something>();