[英]using a template class without a template argument
我有一个带有模板类的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
谢谢,PaulH
如果您根据类型命名,则必须是完整类型(即Foo<int>
而不仅仅是Foo
)。
一个类可以有多个构造函数,也可能没有构造函数,这些构造函数具有类模板的类型参数的参数,因此没有办法使这个函数适用于所有类模板(在我看来,有时会让这项工作感到困惑,但不是全部时间)。
如果你可以根本不命名类型,你可以编写一个MakeFoo<T>()
函数模板来构造一个Foo<T>
并使用函数模板参数推导:
template <typename A>
Foo<A> MakeFoo(const A& a) { return Foo<A>(a); }
此模式通常在C ++中使用(例如,参见make_shared
)。
但是,如果要将返回的对象存储在变量中,则该变量仍需要具有类型。 如果您能够转移到支持C ++ 0x的auto
编译器(如Visual C ++ 2010),那么您可以使用它。 否则,您可以使用像BOOST_AUTO
这样的第三方解决方案或编写自己的解决方案(尽管这可能会有很多工作( - BOOST_AUTO
。
使用auto
,您的代码将如下所示:
auto foo(MakeFoo(myval));
类型推导仅发生在函数模板参数中,而不是类模板参数。
在C ++ 0x中,您可以执行以下操作:
template<typename T>
Foo<T> CreateFoo(const T & a)
{
return Foo<T>(a);
}
auto foo = CreateFoo(myval); //No need to write CreateFoo<int>(myval);
C ++ 17 修复了这个问题, 为构造函数引入了模板参数推导 。
引用Herb Sutter :
[...]你可以写
pair p(2, 4.5);
而不是pair<int,double> p(2, 4.5);
或者auto p = make_pair(2, 4.5);
。 这非常甜蜜,包括它淘汰了许多“制造”助手。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.