c – 使用没有模板参数的模板类
发布时间:2020-12-16 10:19:24 所属栏目:百科 来源:网络整理
导读:我有一个带有模板类的Visual Studio 2008 C项目,该模板类在构造函数中获取模板化值,如下所示: template typename A struct Foo{ const A a_; Foo( const A a ) : a_( a ) { };}; 因此,我必须像这样构造这个类: int myval = 0;Foo int foo( myval ); 当在构
我有一个带有模板类的Visual Studio 2008 C项目,该模板类在构造函数中获取模板化值,如下所示:
template< typename A > struct Foo { const A& a_; Foo( const A& a ) : a_( a ) { }; }; 因此,我必须像这样构造这个类: int myval = 0; Foo< int > foo( myval ); 当在构造函数中已经指定int时,必须将int指定为模板参数似乎是多余的.我想用某种方式像这样使用它: Foo foo( myval ); 因为,我得到编译器错误: error C2955: 'Foo' : use of class template requires template argument list 谢谢, 解决方法
如果你根本命名类型,它必须是完整的类型(即,Foo< int>而不仅仅是Foo).
一个类可以有多个构造函数,也可能没有构造函数,这些构造函数具有类模板的类型参数的参数,因此没有办法使这个函数适用于所有类模板(在我看来,有时会让这项工作感到困惑,但不是全部时间). 如果您可以根本不命名类型,则可以编写构造Foo< T>的MakeFoo< T>()函数模板.并使用函数模板参数推导: template <typename A> Foo<A> MakeFoo(const A& a) { return Foo<A>(a); } 此模式通常用于C(例如,参见make_shared). 但是,如果要将返回的对象存储在变量中,则该变量仍需要具有类型.如果您能够转移到支持C 0x自动的编译器(如Visual C 2010),那么您可以使用它.否则,您可以使用像 使用auto,您的代码将如下所示: auto foo(MakeFoo(myval)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |