这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Whyis‘usingnamespacestd;’consideredabadpracticeinC++?我在我的代码中的很多地方都使用了STL的shared_ptr并且我在我使用过的任何地方都使用了以下using语句shared_ptr:usingnamespacestd::tr1;现在我需要使用boost::bimap。所以我必须在我的代码中包含以下头文件:#include一旦我包含了bimap头文件,shared_ptr类型就变得不明确了,我必须将shared_ptr的所有用法更改为std::tr1::
代码#include#includetemplate::value>::type>Tfoo(Tt){returnt;}templatevoidfoo(Tt){}intmain(){foo(5);}错误main.cpp:Infunction'intmain()':main.cpp:14:15:error:callofoverloaded'foo(int)'isambiguousfoo(5);^main.cpp:14:15:note:candidatesare:main.cpp:7:3:note:Tfoo(T)[withT=int;=void]Tfoo(Tt){returnt;}^main
这可以在VisualC++2015Update3RC上正常编译和运行:classA{templatevoidf(){}};classB:A{};classC:A{};classD:B,C{};intmain(){Dd;d.f();}这段代码有两个问题:f()是私有(private)的,所以d.f()应该无法编译。f()是模棱两可的,因为它可能是B::f()或C::f().但是,/Wall没有诊断功能和B::f()叫做。倒序D继承自getsC::f()调用,所以我猜它只是使用列表中的第一个基类。g++和clang都正确。我是否遗漏了什么或者这是VisualC++中的错误?
我已经看到关于SO的其他问题,但没有一个能完整解释它。编译器处理以下两种情况的正确方法是什么?我已经在gcc4.7.1(使用-std=c++0x)、VS2010和VS2012上进行了尝试,但都得到了不同的结果:示例1:structBB{//genericcasttemplateoperatorT()const{return0;}//stringcastoperatorstd::string()const{returnstring("hello");}};intmain(){BBb;strings=b;}输出:gcc4.7.1:好的VS2010:好的VS2012:失败:“无法从BB转换为
在C++11中,我需要从0,...,n递归调用一个函数(其中n是编译时间常量)。这是问题的结构,似乎存在致命缺陷:#include"Eigen/Dense"templatestructInt{};templateconstexprXeval(constC&c,constX&x,constInt&,constInt&){return1;}templateconstexprXeval(constC&c,constX&x,constInt&,constInt&){returnx*eval(c,x,Int(),Int());}intmain(){constsize_td=1;constEige
VisualC++2017干净地编译以下内容,调用用户定义的log://Sourceencoding:UTF-8withBOM∩#include//std::for_each#include#include//::(sin,cos,atan,...,log)#include//std::stringvoidlog(std::stringconst&message){std::clogint{autoconstmessages={"Blahblah...","Duh!","Okidoki"};std::for_each(messages.begin(),messages.end(),lo
考虑以下C++11代码:structC{};voidf(int(C));f的类型是否与:typedefintT(C);voidf(T);或者是这样的:voidf(intC);也就是说,(C)应该被解释为参数名称C的declarator,还是作为一个抽象-函数参数的声明符?这是在标准中的什么地方规定的? 最佳答案 这是在8.2p7中指定的7Anotherambiguityarisesinaparameter-declaration-clauseofafunctiondeclaration,orinatype-idthatistheop
考虑以下代码:#includevoidfoo(intm);voidfoo(int&k);intmain(){foo(5);//ok,becausethereisnoambiguityintm=5;//foo(m);//compile-timeerror,becauseofambiguityfoo(m+0);//ok,becauseit'sanexpressionoftypeintandnotobject'slvalue}voidfoo(intm){std::cout我知道它为foo(m)引入了歧义,但是当表达式是int类型(或其他可以转换为的类型时,这是允许的吗>int)?我试图找到一
我有一个非常令人兴奋的库,可以转换点:它应该适用于任何点类型templateautotranslate_point(T&p,intx,inty)->decltype(p.x,p.y,void()){p.x+=x;p.y+=y;}templateautotranslate_point(T&p,intx,inty)->decltype(p[0],void()){p[0]+=x;p[1]+=y;}translate_point将与具有公共(public)x和y成员的点一起工作,它也将与元组/可索引容器一起工作,其中x和y分别由第一个和第二个元素表示。问题是,另一个库定义了一个具有公共(pub
我正在尝试创建一个带有字符串和char*转换运算符的类,这会在尝试创建字符串时产生模糊调用错误。假设我有以下类(class):classA{public:A(){};operatorconstchar*()const{return"a"};operatorconststring()const{return"b"};}以及以下主要程序:intmain(){Aa;stringb=string(a);return0;}这导致对basic_string(A&)的模糊调用错误还尝试了以下方法:classA{public:A(){};operatorconstchar*()const{return