Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用不带模板参数的模板类 我有一个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 - Fatal编程技术网

使用不带模板参数的模板类 我有一个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++满意它