使用没有模板参数的模板类

时间:2011-06-17 16:31:53

标签: c++ templates

我有一个带有模板类的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作为模板参数,则似乎是多余的。我想用某种方式使用它:

Foo foo( myval );

按原样,我收到编译器错误:

error C2955: 'Foo' : use of class template requires template argument list

谢谢, PaulH

3 个答案:

答案 0 :(得分:5)

如果您根据类型命名,则必须是完整类型(即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或编写自己的解决方案(尽管这可能需要做很多工作( - :)。

使用auto,您的代码如下所示:

auto foo(MakeFoo(myval));

答案 1 :(得分:4)

类型推导仅使用 function 模板参数,而不是 class 模板参数。

在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);

答案 2 :(得分:3)

C ++ 17 修复此问题,介绍template argument deduction for constructors

引用Herb Sutter

  

[...]您只能写pair p(2, 4.5);而不是pair<int,double> p(2, 4.5);auto p = make_pair(2, 4.5);。这非常可爱,包括它淘汰了许多“制造”助手。