考虑这段代码:usingtype=long;namespacen{usingtype=long;}usingnamespacen;intmain(){typet;}这可以在Clang3.7和GCC5.3上干净地编译,但是MSVC19*给出以下错误消息:main.cpp(9):errorC2872:'type':ambiguoussymbolmain.cpp(1):note:couldbe'longtype'main.cpp(4):note:or'n::type'这段代码格式是否正确?标准的哪一部分说明在歧义检查之前是否已解析别名?请注意,如果您更改其中一个别名,Clang和GCC都会给
这个问题在这里已经有了答案:Whydoespointerdecaytakepriorityoveradeducedtemplate?(1个回答)关闭6年前。为什么第一个函数调用(cm(car);)绑定(bind)到第一个函数?我知道第二次调用绑定(bind)到第二个函数,因为它不是模板,尽管两者都是完美匹配。如果第一个函数定义为固定数组长度的非模板,如:voidcm(constchar(&h)[8]){cout然后它再次被选中而不是第二个(第二个调用将以这种方式模棱两可)。代码:templatevoidcm(constchar(&h)[N]){std::cout输出:const(&)[
下面的代码可以用大多数现代C++11兼容编译器(GCC>=5.x、Clang、ICC、MSVC)成功编译。#includestructA{explicitA(constchar*){}A(std::string){}};structB{B(A){}B(B&)=delete;};intmain(void){Bb1({{{"test"}}});}但是为什么首先要编译它,列出的编译器如何解释该代码?为什么MSVC能够在没有B(B&)=delete;的情况下编译这个,但是其他3个编译器都需要吗?以及为什么当我删除时它在除MSVC之外的所有编译器中都失败不同的签名复制构造函数,例如B(const
在以下(有效的)代码示例中,模板化的register_enum()函数用于迭代枚举并调用用户提供的回调以将枚举值转换为C字符串。所有枚举都在一个类中定义,枚举到字符串的转换是使用静态to_cstring(enum)函数完成的。当一个类(如下面的着色器类)有多个枚举和相应的重载to_cstring(enum)函数时,编译器无法决定将哪个是正确的to_cstring()函数传递给register_enum()。我认为代码比我能解释得更好...#include#include//ActualcodeusesLua,butforsimplification//I'llhideitinthise
我很确定这一定已经在这里了,但是我没有找到太多关于如何解决这类问题的信息(没有在通话中转换):给定两个重载,我希望带有文字0的函数调用始终调用unsignedint版本:voidfunc(unsignedint){cout我明白为什么会这样,但我不想一直写func(0u)甚至func(static_cast(0))。所以我的问题是:1)通常有推荐的方法吗?2)按照下面的方式做有什么问题吗?这样做的原因是什么?voidfunc(unsignedint){coutvoidfunc(T*){static_assert(std::is_same::value,"onlyvoidpointers
我发现C++运算符重载解析的奇怪行为,我自己无法解释。指向描述它的某些资源的指针与答案一样好。我有2个翻译单元。在一个(称为util.cpp/h)中,我声明并定义了两个运算符(我省略了可读性的实际实现,无论如何都会出现问题)://util.h#ifndefGUARD_UTIL#defineGUARD_UTIL#includestd::istream&operator>>(std::istream&is,constchar*str);std::istream&operator>>(std::istream&is,char*str);#endif和://util.cpp#include"u
我有一个真实的情况,可以用下面的例子来概括:templatestructNotifier{voidadd_listener(ListenerType&){}};structTimeListener{};structSpaceListener{};structA:publicNotifier,publicNotifier{};structB:TimeListener{};intmain(){Aa;Bb;a.add_listener(b);//whyisambiguous?return0;}为什么B对编译器来说并不明显?是TimeListener,因此唯一可能的重载解决方案是Notifie
以下代码无法编译:#include#includestructFoo{Foo(){std::coutstructBar{Foofoo;Bar(constBar&){std::coutBar(Args&&...args):foo(std::forward(args)...){std::coutbar1{};Barbar2{bar1};}编译器错误提示我编译器试图使用可变参数模板构造函数而不是复制构造函数:prog.cpp:Ininstantiationof'Bar::Bar(Args&&...)[withArgs={Bar&};T=Foo]':prog.cpp:27:20:require
我写了一些代码Ss;...s={};,希望它最终和Ss={};一样。然而它没有。以下示例重现了该问题:#includestructS{S():a(5){}S(intt):a(t){}S&operator=(intt){a=t;return*this;}S&operator=(Sconst&t)=default;inta;};intmain(){Ss={};St;t={};std::cout输出是:50我的问题是:为什么这里选择的是operator=(int),而不是“ambiguous”或者其他?有没有不改变S的简洁解决方法?我的意图是s=S{};。编写s={};如果可行的话会很方便。
看完Howtomakethesestd::functionparametersunambiguous?这个问题我完全糊涂了,到目前为止,我以为我理解什么是函数模板的部分排序,但是在阅读了那个问题之后,我写下了三个示例来检查编译器的行为,但收到的结果对我来说很难理解.示例#1templatevoidfoo(T){}templatevoidfoo(T&){}intmain(){inti;foo(i);//error:callisambiguous!}问题:这两个函数都是可行的,这很明显,但不是那个占用T&的函数吗?比T更专业?相反,编译器会引发模棱两可的调用错误。示例#2#includet