使用不带模板参数的模板类 我有一个VisualStudio 2008 C++项目,它带有一个模板类,它在这样的构造函数中采用模板化值: template< typename A > struct Foo { const A& a_; Foo( const A& a ) : a_( a ) { }; }; int myval = 0; Foo< int > foo( myval ); Foo foo( myval ); template<typename T> Foo<T> CreateFoo(const T & a) { return Foo<T>(a); } auto foo = CreateFoo(myval); //No need to write CreateFoo<int>(myval);
按原样,我得到了编译器错误:使用不带模板参数的模板类 我有一个VisualStudio 2008 C++项目,它带有一个模板类,它在这样的构造函数中采用模板化值: template< typename A > struct Foo { const A& a_; Foo( const A& a ) : a_( a ) { }; }; int myval = 0; Foo< int > foo( myval ); Foo foo( myval ); 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++,templates,C++,Templates,按原样,我得到了编译器错误: error C2955: 'Foo' : use of class template requires template argument list 谢谢, PaulH如果你命名类型,它必须是完整的类型(即,Foo,而不仅仅是Foo) 一个类可以有多个构造函数,或者可能没有任何构造函数具有类模板的类型参数的参数,因此没有办法使所有类模板都可以使用此方法(在我看来,有时使用此方法会让人困惑,但不是一直使用此方法) 如果您完全可以不命名类型,则可以编写一个MakeFo
error C2955: 'Foo' : use of class template requires template argument list
谢谢,
PaulH如果你命名类型,它必须是完整的类型(即,
Foo
,而不仅仅是Foo
)
一个类可以有多个构造函数,或者可能没有任何构造函数具有类模板的类型参数的参数,因此没有办法使所有类模板都可以使用此方法(在我看来,有时使用此方法会让人困惑,但不是一直使用此方法)
如果您完全可以不命名类型,则可以编写一个MakeFoo()
函数模板来构造Foo
,并使用函数模板参数推断:
template <typename A>
Foo<A> MakeFoo(const A& a) { return Foo<A>(a); }
类型推断仅在函数模板参数中发生,而不在类模板参数中发生 在C++0x中,可以执行以下操作:
template< typename A >
struct Foo
{
const A& a_;
Foo( const A& a ) : a_( a ) { };
};
int myval = 0;
Foo< int > foo( myval );
Foo foo( myval );
template<typename T>
Foo<T> CreateFoo(const T & a)
{
return Foo<T>(a);
}
auto foo = CreateFoo(myval); //No need to write CreateFoo<int>(myval);
模板
Foo CreateFoo(const T&a)
{
返回Foo(a);
}
自动foo=CreateFoo(myval)//无需编写CreateFoo(myval);
C++17修复了此问题,引入了
引用:
[…]您可以只编写对p(2,4.5)代码>而不是对p(2,4.5)代码>或<代码>自动p=配对(2,4.5)代码>。这是相当甜蜜的,包括它淘汰了许多“制造”助手
我相信这是不可能的。我花了一天时间在这上面,发现一些消息来源说它不是标准的,我无法让msvc或g++满意它