草庐IT

TEMPLATE

全部标签

所有指针的 C++ 模板和所有数组的模板

我正在寻找以下问题的解决方案:我有一个类,我想在其中为所有类型的指针和所有类型的指针重载运算符(在本例中为&)阵列。在数组的实现中,我需要访问arraysize,在指针的实现中,我必须能够对取消引用的对象执行某些操作。正如指出的那样here,数组的方式很清楚:templatevoidoperator&(T(&arr)[N]){cout但对于指针来说,以下都不起作用://ifIusethis,theoperatorgetsambigousforarraystemplateinlinevoidoperator&(T*p){cout是否有任何好的和干净的解决方案来实现运算符对任意数组和任意指

c++ - 实例化函数模板的编译问题

考虑以下代码:#includestructS{voidf(constchar*s){std::coutvoidinvoke(S*pd,Args...args){(pd->*mem_fn)(args...);}intmain(){Ss;void(*pfn)(S*,constchar*)=invoke;pfn(&s,"hello");}编译代码时,clang报错如下:main.cpp:16:33:error:addressofoverloadedfunction'invoke'doesnotmatchrequiredtype'void(S*,constchar*)'void(*pfn)(S

c++ - 模板类的模板友元函数

我有以下模板类和模板函数,它们旨在访问类的私有(private)数据成员:#includetemplateclassMyVar{intx;};templatevoidprintVar(constMyVar&var){std::coutvoidscanVar(MyVar&var){std::cin>>var.x;}structFoo{};intmain(void){MyVara;scanVar(a);printVar(a);return0;}将这两个函数声明为MyVar的友元函数,我在templateclassMyVar的声明中尝试了以下方法宣告友元。它们都不起作用。我该怎么办?temp

c++ - 模板特化在其实例化点看不到函数

我不明白为什么它不正确#includeusingnamespacestd;structCL{};templatevoidfnc(Tt){f(t);}namespaceNS{voidf(CL){}voidfn(){fnc(CL());/*errorishere*/}//pointofinstantiationfncishere(innamespacescope,//accordingto14.6.4.1/1)}intmain(){}调用f(t)在模板函数中fnc依赖于模板参数,然后名称查找必须在实例化点进行。我看到了标准(C++14)14.6.4.1/1Forafunctiontempl

C++ 可变参数模板特化(和 static_assert)

是否可以专门化此模板声明:templateTYPEFoo(ARGS...args){static_assert(false);}我尝试了一些事情,例如:templateintFoo(floatargs){return42;}...但是当我尝试这样使用它时,我总是会遇到静态断言:autovalue=Foo(1.5f);正确的语法是什么? 最佳答案 您不得编写仅在未实例化时才有效的模板。这与标准中的以下规则相冲突:Ifnovalidspecializationcanbegeneratedforatemplate,andthattempl

c++ - 为什么模板特化不能改变返回类型?

看完thisquestion我不得不再次意识到我对模板知之甚少。我可以理解,像这样的模板特化//Atemplatevoidfoo(Tx){}templatevoidfoo(intx){}无法工作(error:template-id'foo'for'voidfoo(int)'doesnotmatchanytemplatedeclaration)。不仅意义不大,而且参数推导也没有机会得到正确的T。.但是,我不明白为什么它不适用于返回类型://Btemplateintfoo(Tx){}templatedoublefoo(doublex){}(与上述类似的错误)。实际上我手头没有任何特定的用例

c++ - 隐式模板推导指南可以推导引用类型吗?

在使用gcc7测试C++17推导指南行为时,我发现这个例子失败了:templatestructS{S(T&&v){}};inti=10;autov=S(i);根据我从cppreference读到的内容,我以为v应该是S类型.然而gcc7不编译此代码提示int&不能绑定(bind)到int&&(通用引用机制失效)。所以我的问题是:gcc7应该推导出v类型为S?工作草案标准中哪里描述了自动扣除指南? 最佳答案 [over.match.class.deduct]中的规则是:Asetoffunctionsandfunctiontemplat

c++ - SFINAE 优雅地检查 "template template class"(在模板参数中)

如何在模板参数中检查模板模板类的类型?例子B和C是模板类。我想创建一个类D那可以是D或D.只有D有D::f().这是我的解决方法(demo)。它有效。#includeusingnamespacestd;classDummy{};templateclassB{};templateclassC{};templateclassBC>classD{//f()isinstantiatedonlyif"BC"=="B"public:template>statictypenamestd::enable_if>::value,void>::typef(){}//^#1};intmain(){D::f(

c++ - 警告 C4661 :no suitable definition provided for explicit template instantiation request

我写了一个类模板并在不同的DLL中使用它,所以希望隐藏部分实现。为此,我使用“模板实例化”,但导出它,像这样,这里是头文件:#include#includeusingnamespacestd;templateclass__declspec(dllexport)Templated{public:Templated();};template__declspec(dllexport)Templated;intmain(){cout并且定义在单独的文件(.cpp)中templateTemplated::Templated(){}templateTemplated;我的问题是我收到警告,即使实例

c++ - 模板实例化失败 : compiler choosing improper overload function

我对模板并不陌生,但我遇到了一个相当奇怪的问题,我需要将模板类型分离到它的组件中,以用于我正在处理的数据序列化程序。这很难解释,所以我已经证明了。这是我简化的示例问题,example.cpp。templatevoidfoo(T&arg){}templatevoidfoo(T&arg){}intmain(intargc,char*argv[]){foo(argc);return0;}我得到一个错误,然后是一个警告,这似乎表明它正在尝试实例化两个函数,但只有其中一个是合适的。$g++-Wall-Wexample.cppexample.cpp:2:43:error:‘T’isnotatemp