2015-01-15 3 views
1

мне нужна шаблон-оф-шаблона класс, но проблема в том, что я не могу получить доступ к типу вложенного шаблона:Обращения к вложенному параметру шаблона

template<template<class TParamPayload> class TMsg> 
class ParameterBasedFilter : public IMsgFilter 
{ 
public: 
    typedef TMsg<TParamPayload> ExpectedMessage; 
    typedef TParamPayload::otherType SomeOtherType; 
}; 

А вот использование (я хочу передать только один аргумент шаблона, без запятой)

ParameterBasedFilter<SomeMessage<SomePayload>> filter; 

Существует ошибка в ParameterBasedFilter:

error: 'TParamPayload' was not declared in this scope 
typedef TMsg<TParamPayload> ExpectedMessage; 
      ^

Возможно ли вообще получить тип вложенного шаблона? Я знаю, что ниже код будет работать

template<class TParamPayload, template<class> class TMsg> 
class ParameterBasedFilter : public IMsgFilter 
{ 
public: 
    typedef TMsg<TParamPayload> ExpectedMessage; 
    typedef TParamPayload::otherType SomeOtherType; 
}; 

, но тогда я должен пройти 2-х типов для аргументов шаблона:

ParameterBasedFilter<SomePayload, SomeMessage<SomePayload>> filter; 

и это выглядит странно, потому что SomePayload используется дважды.

+1

Возможный дубликат [Где и почему я должен поставить «шаблон» и «TYPENAME» ключевые слова? ] (http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords) –

+0

Я не думаю, что это дубликат (по крайней мере, не упомянутого вопроса). ОП спрашивает, почему он не может ссылаться на (названные) параметры шаблона параметра шаблона шаблона, т. Е. 'TParamPayload' (jeez .. кто-нибудь это понял?). – JorenHeit

ответ

3

Возможно, вы ищете частичную специализацию? Это позволило бы оригинальный синтаксис, упомянутый в вашем вопросе:

template <typename> class ParameterBasedFilter; 

template <template<class> class TMsg, typename TParamPayload> 
class ParameterBasedFilter<TMsg<TParamPayload>> : public IMsgFilter 
{ 
public: 
    typedef TMsg<TParamPayload> ExpectedMessage; 
    typedef TParamPayload::otherType SomeOtherType; 
}; 

Способ применения прост:

ParameterBasedFilter<SomeMessage<SomePayload>> filter; 
+0

Определенно решение, когда он хочет, чтобы тип, переданный 'ParameterBasedFilter', имел форму' TMsg '. В противном случае просто используйте обычный 'template '. – JorenHeit

+0

@ JorenHeit Что значит? – Columbo

+0

Если он просто хочет использовать случай использования, он может также использовать 'template ' (ваш неспециализированный случай). Однако, чтобы получить вложенный тип, он должен был убедиться, что есть вложенный 'typedef', который определяет аргумент полезной нагрузки, поэтому ваше решение лучше :-) (будет работать для всех STL-подобных контейнеров, хотя). – JorenHeit

2

Нет, вы не можете. Однако вы будете должны пройти

ParameterBasedFilter<SomePayload, SomeMessage> filter; 

SomePayload не будет использоваться дважды. Кроме того, вы должны использовать typename, когда доступ к otherType

typedef typename TParamPayload::otherType SomeOtherType; 
Смежные вопросы