Возможности вложенных шаблонов - PullRequest
1 голос
/ 22 июля 2010

Допустимо ли следующее:

template<typename T> class C { C1<C2<T>> someMember; };

Ответы [ 3 ]

5 голосов
/ 22 июля 2010

Ну, вам нужно что-то сделать с типом, либо сделать его typedef или member, но да:

template <typename T>
struct C1 {};

template <typename T>
struct C2 {};

template <typename T>
struct C
{
    typedef C1<C2T> > type; // note the space!
};

>> на самом деле правильный оператор сдвига, поэтому вам нуженместо там, чтобы оно работало правильно.Однако в C ++ 0x вы можете просто набрать >>;он анализируется просто отлично. *

* Некоторые снисходительные компиляторы в настоящее время принимают его.

1 голос
/ 22 июля 2010

Конечно, я использовал:

vector< pair<int, int> > blah;

раньше.

1 голос
/ 22 июля 2010

Эмм, нет, по крайней мере, не изолированно, потому что у вас нет определения для C1 и C2. Если предположить, что они определены как классы шаблонов с одним аргументом, то нет, это все равно недопустимо по той же причине, что int; недопустимо - это не полный оператор, это просто имя типа.

Теперь, если вы спрашиваете о синтаксисе с угловыми скобками, тогда игнорируете все остальные проблемы, это допустимо только в C ++ 0x. В текущем стандарте C ++ синтаксический анализ является неоднозначным, и вам придется сформировать его как C1<C2<T> >.

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