используя класс шаблона без аргумента шаблона - PullRequest
3 голосов
/ 17 июня 2011

У меня есть проект 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 ]

5 голосов
/ 17 июня 2011

Если вы вообще назовете тип, он должен быть полным (то есть 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));
4 голосов
/ 17 июня 2011

Вывод типа происходит только с функцией аргумента шаблона, но не с классом аргумента шаблона.

В 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);
3 голосов
/ 28 сентября 2016

C ++ 17 исправлена ​​ эта проблема, представляющая шаблонный аргумент для конструкторов .

Ссылаясь на Херб Саттер :

[...] вы можете написать просто pair p(2, 4.5); вместо pair<int,double> p(2, 4.5); или auto p = make_pair(2, 4.5);. Это довольно мило, в том числе и то, что это устарело у многих помощников "make".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...