草庐IT

c++ - 如何以不同方式专门化 typedef 及其隐式类型?

我有这样的东西:typedefintAnotherType;templateFunc(TValue);//AndIwanttospecializethesetwocasesseparately:templateboolFunc(intValue){...}templateboolFunc(AnotherTypeValue){...}我真的不需要专攻int,我真正需要的是为AnotherType执行不同的函数。而且我无法更改AnotherType或基本函数的定义。由于SFINAE,重载也无济于事。 最佳答案 答案是否定的。当您使用ty

c++ - 隐式转换为 C++ 模板对象

我有一个A类:templatestructA{};和一个B类。我希望B类型的对象在作为函数参数给出时隐式转换为A。B看起来像这样:templatestructB{operatorA&()const{return*newA();}};但是,我的测试(如下)在GCC4.5下失败,给出错误:没有匹配的函数调用“test(B&)”我哪里出错了?其他编译器也拒绝这个吗?templatevoidtest(A&a){delete&a;}intmain(intargc,char*argv[]){Bb;test(b);return0;}附注我现在将自己的解决方案放在下面的答案中。

C++:忽略候选模板:模板参数的显式指定参数无效

我有这个函数头:templatestaticvoidOperateOnSurfaces(T1data1,T2data2,SDL_Surface*bmpDest,SDL_Surface*bmpSrc,SDL_Rect&rDest,SDL_Rect&rSrc)我是这样用的:OperateOnSurfaces,PutPixel>(bmpSrc->format,bmpDest->format,bmpDest,bmpSrc,rDest,rSrc);这是GetPixel和PutPixel:templatestaticColorGetPixel(SDL_PixelFormat*format,Uint

c++ - (g++ 4.7.1) 用等效类 typedef 替换显式类型名称无法编译

我正在尝试创建一个模板化函数,它接受一个可迭代对象和一个函数,这样传递的函数将被隐式转换为适当类型的std::function(从而允许它与完整函数和lambda一起使用)。代码如下:#include#include#include#includetemplatevoidbar(constT&base,std::functionf)//works//voidbar(constT&base,std::functionf)//failstocompile{std::cout)==typeid(std::function))?"identical":"distinct"){0,1},filt

c++ - 防止构造函数参数隐式转换为外部库类型

考虑以下代码:#include#includetypedefboost::iterator_range>int_range;templateclassRef{T*p_;public:Ref(T*p):p_(p){}/*possiblyotherimplicitconversionconstructors,butnounconstrainedtemplateconstructorsthatdon'tusetheexplicitkeyword...*/operatorT*()const{returnp_;}operatorconstT*()const{returnp_;}};structB

c++ - 为什么我不能将 this 指针显式传递给成员函数?

C++标准(ISOc++11)在第9.3.1节中提到Anon-staticmemberfunctionmaybecalledforanobjectofitsclasstype,orforanobjectofaclassderived(Clause10)fromitsclasstype,usingtheclassmemberaccesssyntax(5.2.5,13.3.1.1).尝试使用g++(版本4.8.2)编译此代码classfoo{public:voidbar(){cout给出编译时错误,因为它无法匹配函数的签名。考虑到标准关于调用成员函数的规定,我想这是意料之中的。由于该方法在

c++ - 隐式拷贝构造函数

引自n333712.3.1/3Anon-explicitcopy/moveconstructor(12.8)isaconvertingconstructor.Animplicitly-declaredcopy/moveconstructorisnotanexplicitconstructor;itmaybecalledforimplicittypeconversions.引自ANSIISOIEC148822003Anon-explicitcopy-constructor(12.8)isaconvertingconstructor.Animplicitly-declaredcopycon

c++ - 当链接器可以使用显式特化时,所有编译器都会忽略生成的模板代码吗?

我最近在专门化模板时遇到了让我感到不安的情况:foo.h:templatevoidfoo(){std::coutfoo.cc:#include"foo.h"templatevoidfoo(){std::cout"主.cc:#include"foo.h"intmain(){foo();}所以。我编译如下:g++-cmain.ccg++-cfoo.ccg++-omainmain.ofoo.o输出是"Thisisfoo".我喜欢这个输出。但我担心我所观察到的可能是gcc独有的(我无权访问其他编译器,因此无法检查)。这是我认为gcc正在做的事情:编译main.cc时,我希望它发出foo调用的通

c++ - 从 int 到 shared_ptr 的隐式转换

考虑下面的代码:#include#includevoidf(std::shared_ptrsp){}templateautocall_f(FuncTypef,PtrTypep)->decltype(f(p)){returnf(p);}intmain(){f(0);//doesn'tworkforanyotherint!=0,thanks@Rupesh//call_f(f,0);//error,cannotconvertinttoshared_ptr}在main()中的第一行,整数0转换为std::shared_ptr和电话f(0)成功没有任何问题。但是,使用模板调用函数会使情况有所不同

c++ - 隐式虚拟性传播的原因是什么?

我只使用C++工作了2到3个月,最近我发现了标识符final,它位于虚函数之后。直到今天,我还相信省略virtual会阻止虚拟性的传播,但我错了。它隐式传播。我的问题是这样的。为什么允许隐式传播?为什么virtual的存在不能使函数成为虚函数而virtual的存在不能使函数不是虚函数?在某些情况下更好吗?还是在虚拟首次引入的那一天?根据Clifford'sanswer,甚至还有一个编译器会在缺少virtual时生成警告。whyisthevirtualityofmethodsimplicitlypropagatedinc我希望上面的链接能回答我的问题,但事实并非如此。----------