草庐IT

c++ - 为什么函数重载会在 C++ 中产生模棱两可的错误?

在以下代码片段中,在函数调用f(1)中,1是int类型的文字,并且在第一个函数中voidf(doubled)参数类型是double并且第二个函数voidf(shortinti)参数类型是shortint。这里1是int类型不是double类型,那么为什么编译器会产生歧义错误?#includeusingnamespacestd;voidf(doubled)//Firstfunction{cout 最佳答案 因为,正如您的评论所指出的,1是int类型的文字。对于编译器,int到shortint的隐式转换与int到的隐式转换同样有效dou

c++ - 为什么函数重载会在 C++ 中产生模棱两可的错误?

在以下代码片段中,在函数调用f(1)中,1是int类型的文字,并且在第一个函数中voidf(doubled)参数类型是double并且第二个函数voidf(shortinti)参数类型是shortint。这里1是int类型不是double类型,那么为什么编译器会产生歧义错误?#includeusingnamespacestd;voidf(doubled)//Firstfunction{cout 最佳答案 因为,正如您的评论所指出的,1是int类型的文字。对于编译器,int到shortint的隐式转换与int到的隐式转换同样有效dou

c++ - 为什么这个对 swap() 的调用模棱两可?

下面的程序#include#include#includenamespacemy_namespace{templatevoidswap(T&a,T&b){Ttmp=std::move(a);a=std::move(b);b=std::move(tmp);}template>classfoo{};}intmain(){my_namespace::foo*a,*b;usingmy_namespace::swap;swap(a,b);return0;}导致g++和clang在我的系统上发出以下编译器错误:$clang-std=c++11swap_repro.cpp-I.swap_repro.

c++ - 为什么这个对 swap() 的调用模棱两可?

下面的程序#include#include#includenamespacemy_namespace{templatevoidswap(T&a,T&b){Ttmp=std::move(a);a=std::move(b);b=std::move(tmp);}template>classfoo{};}intmain(){my_namespace::foo*a,*b;usingmy_namespace::swap;swap(a,b);return0;}导致g++和clang在我的系统上发出以下编译器错误:$clang-std=c++11swap_repro.cpp-I.swap_repro.

java - 带有泛型和可变参数的模棱两可的重载 java 方法

我试图了解java如何处理函数调用中的歧义。在下面的代码中,对method的调用是不明确的,但method2不是!!!。我觉得两者都模棱两可,但是为什么当我注释掉对method的调用时会编译?为什么method2也没有歧义?publicclassA{publicstaticListmethod(finalKarg,finalObject...otherArgs){System.out.println("I'minone");returnnewArrayList();}publicstaticListmethod(finalObject...otherArgs){System.out.p

java - 带有泛型和可变参数的模棱两可的重载 java 方法

我试图了解java如何处理函数调用中的歧义。在下面的代码中,对method的调用是不明确的,但method2不是!!!。我觉得两者都模棱两可,但是为什么当我注释掉对method的调用时会编译?为什么method2也没有歧义?publicclassA{publicstaticListmethod(finalKarg,finalObject...otherArgs){System.out.println("I'minone");returnnewArrayList();}publicstaticListmethod(finalObject...otherArgs){System.out.p

c++ - 这实际上是模棱两可的吗?

所以我知道代码中的大括号不仅仅意味着initializer_list。:WhatIsaCurly-BraceEnclosedListIfNotanintializer_list?但是他们应该默认什么?例如,假设我定义了一个重载函数:voidfoo(constinitializer_list&row_vector){cout>&matrix){cout如果我调用foo({1,2,3})第1st显然会被调用。如果我调用foo({{1,2,3},{4,5,6},{7,8,9}})第二个nd显然会被调用。但是如果我调用:foo({{1},{2},{3}})那些嵌套大括号是int-初始化器或in

c++ - 模棱两可的调用(从 char* 到 lambda 与 std::string 的转换)

根据我的编译器gcc-4.6,下面示例中对func的调用是不明确的。voidfunc(conststd::string&str){}voidfunc(std::functionf){}voidtest(){func("Hello");}编译器这样说是否正确?如果我删除第一个重载,此代码将无法编译,因为它将无法实例化所涉及的模板。除了重命名这两个函数之一或显式转换为std::string之外,还有什么办法可以解决这个问题吗? 最佳答案 可由SFINAE在std::function的构造函数中解析。但是,它似乎不是必需的,也不是由GCC

c++ - ISO C++ 说这些是模棱两可的,

为了在控制台中写入和在二进制文件中写入,我必须重载移位运算符“我在ostream重载方面做得很好,而我在重载fstream时遇到了一些问题,这里是:在我的标题中:friendostream&operator在我的cpp文件中:fstream&operator这是我面临的错误:在函数`std::fstream&operatorISOC++saysthattheseareambiguous,eventhoughtheworstconversionforthefirstisbetterthantheworstconversionforthesecond:std::basic_ostream&

c++ - VC++ 2012 中出乎意料的模棱两可的重载解析

VisualC++2012。代码。我认为它应该编译;编译器恭敬地不同意。我已将我的复制范围缩小到:structB{};voidfoo(B*b,signedintsi){}//Overload1voidfoo(Bconst*b,unsignedintui){}//Overload2intmain(){Bb;unsignedintui;foo(&b,ui);}所以我们有两个候选的重载决议。对于第一个重载,第一个参数完全匹配,第二个参数需要整数转换(无符号到有符号)。对于第二个重载,第二个参数完全匹配,第一个参数需要cv调整(因为&b是指向非常量的指针)。现在看来,这应该是完全没有歧义的了。