为什么一个程序被拒绝为可以通过过载解决来解决的模糊程序
Why is a program rejected as ambiguous that could be resolved by overload resolution?
以下程序因不明确而被gcc拒绝:
struct Aint
{
virtual void foo(int);
};
struct Astring
{
virtual void foo(std::string);
};
struct A: public Aint, public Astring {};
int main()
{
std::string s;
A a;
a.foo(s);
return 0;
}
> vt.cpp: In function ‘int main()’: vt.cpp:13:9: error: request for
> member ‘foo’ is ambiguous
> a.foo(s);
> ^ vt.cpp:5:34: note: candidates are: virtual void Astring::foo(std::__cxx11::string)
> struct Astring {virtual void foo(std::string);};
> ^ vt.cpp:4:31: note: virtual void Aint::foo(int)
> struct Aint {virtual void foo(int);};
Clang一直以同样的理由拒绝该程序:
clang -std=c++1y -c vt.cpp
vt.cpp:13:9: error: member 'foo' found in multiple base classes of different types
a.foo(s);
^
vt.cpp:4:31: note: member found by ambiguous name lookup
struct Aint {virtual void foo(int);};
^
vt.cpp:5:34: note: member found by ambiguous name lookup
struct Astring {virtual void foo(std::string);};
我不完全确定我是否正确理解了第10.2节中的查找规则,所以我将通过以下步骤中的规则来计算查找集S(foo,A):
1. A does not contain `foo`, so rule 5 applies and S(foo, A) is initially empty. We need to calculate the lookup sets S(foo, Aint) and S(foo, Afloat) and merge them to S(foo, A) = {}
2. S(foo, Aint) = {Aint::foo}
3. S(foo, Afloat) = {Afloat::foo}
4. Merge S(foo, Aint) = {Aint::foo} into S(foo, A) = {} to get S(foo, A) = {Aint::foo} (second case of 6.1)
5. Merge S(foo, Afloat) = {Afloat::foo} into {Aint::foo}. This create an ambiguous lookup set because of rule 6.2
结果集是一个无效集,因此程序格式不正确。
我想知道为什么这个项目这么早就被拒绝了。在这种情况下,编译器应该很容易进行重载解析,因为两个函数的名称相同,但签名不同,所以没有真正的歧义。是否有技术原因没有这样做,或者是否有其他原因会接受不正确的程序?有人知道这么早就拒绝这些项目的决定背后的理性吗?
在C++中,不存在跨作用域的重载——派生类作用域不是这个一般规则的例外。请参阅以了解更多详细信息。无论如何,您的示例可以通过指定您希望通过"using"关键字同时使用两个版本的foo来进行改进。请参阅以下示例。
示例程序:
#include <iostream>
#include <string>
struct Aint
{
void foo(int){std::cout<<"n Aint";}
};
struct Astring
{
void foo(std::string){std::cout<<"n Astring";}
};
struct A: public Aint, public Astring {
using Aint::foo;
using Astring::foo;
};
int main()
{
std::string s;
A a;
a.foo(s);
return 0;
}
output:Astring
相关文章:
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 如何解决在负数的情况下程序以相同方式工作的问题?
- 系统错误:程序无法启动,因为您的计算机中缺少MSVCP140D.DLL。尝试重新安装该程序以解决此问题
- 如何在Arduino程序中解决"invalid operands of types"?
- 在Linux/Ubuntu中编译openCV应用程序时,如何解决未定义的引用cv:..?
- 试图解决这个简单的C++程序,但我被困在某个地方
- 如何在程序中实现单词跳过解决方案
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 在跨平台桌面/移动应用程序套件中使用 ZeroMQ 来解决架构问题
- 开发如何解决错误193:%1不是Dev C 中的Win32应用程序
- 当我们在以下程序(C )中输入字符时,该如何解决
- 如何计算该程序的复杂性?是否有任何其他复杂性较低的解决方案
- 我收到阻止我运行程序的警告,但不确定如何解决
- QT创建者:简单程序未解决的外部符号和外部符号错误
- 如何解决使用QXml格式化程序时FODC0002的错误
- 任何熟悉Codecademy C++/程序的人都可以帮助解决菜鸟问题吗?
- MPI在某个进程找到解决方案时使用广播结束程序
- 谁能帮助我解决以下 c++ 代码中的问题?该程序不提供任何输出
- 如何用单个信号处理程序解决这个多linux定时器的问题
- 将类从应用程序解决方案移动到静态库解决方案会产生无法解决的外部符号链接错误