2010-07-22 2 views
1

Является действительным следующее ?:Вложенные возможности шаблона

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

Что именно вы пытаетесь достичь? – Jordan

+0

Я отнял у него все, что могу, но это довольно плохой вопрос. Мы понятия не имеем, что такое «C1» и «C2», мы не знаем, какова ваша реальная проблема, и каковы ваши цели. Нет, это недействительно, потому что 'C1' и' C2' не определены или даже если они были такими, как я их определил, теперь это недействительно, потому что '>>' является оператором правого сдвига. И если мы вводим пробел, это неверно, потому что вы просто назвали тип и ничего не объявили. Слишком неполно; обеспечить реальный код, реальные проблемы и реальные цели, если вы хотите получить реальные ответы. – GManNickG

+0

Ответ, который вы предоставили, является реальным. – user383352

ответ

5

Ну, вы должны были бы сделать что-то с типом, либо сделать его ЬурейеЕ или член, но да:

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

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

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

1

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

vector< pair<int, int> > blah; 

раньше.

Смежные вопросы