2012-05-10 2 views
1

У меня есть класс, как это:Шаблон класса ЬурейеЕ - использовать за пределами класса

struct WorkItemResultData; 

template <typename ExecutionPolicy> 
class Engine 
{ 
public: 
    typedef std::shared_ptr<WorkItemResultData> WorkItemResultData_ptr; 
} 

typedef не зависит от какой-либо аргумент шаблона. Есть ли способ использовать тип Engine::WorkItemResultData_ptr вне класса Engine?

EDIT Я знаю, что смогу использовать его, так как awoodland предложила решение ниже, но мой typedef не зависит от аргументов типа и хочет иметь возможность сделать это, не указав конкретный тип двигателя.

ответ

3

Есть ли способ использования типа Engine::WorkItemResultData_ptr вне класса двигателя?

Да, но вам нужно сказать typename, если это в контексте шаблона, например .:

template <typename T> 
void foo() { 
    typename Engine<T>::WorkItemResultData_ptr instance; 
} 

Вы не можете получить доступ к этому typedef без типа. Возможны три обходных пути:

  1. typedef наружный шаблон! - он явно не имеет большого отношения к шаблону, если он не зависит от типов.
  2. Используйте ложе и обратитесь к Engine<void>::WorkItemResultData_ptr.
  3. Имейте базовый класс без шаблонов, который содержит typedef и наследует от этого. Тогда вы можете получить доступ к нестандартному базовому классу.
+0

Я не хочу указывать имя типа, хотя :-). Я не в контексте шаблона. – Ghita

+0

Я в контексте, где я не знаю/хочу знать тип шаблона двигателя. – Ghita

+0

@Ghita, если он в шаблоне, у вас есть *, чтобы указать тип какого-то типа. Если вы знаете, что неважно, что это за тип, вы всегда можете передать 'void' как тип. – Flexo

3

Поскольку ЬурейеЕ не зависит от Engine вообще, вы можете вытащить его из класса:

typedef std::shared_ptr<WorkItemResultData> WorkItemResultData_ptr; 

template <typename ExecutionPolicy> 
class Engine {...}; 

Если вы хотите сохранить это инкапсулированные, просто использовать пространство имен:

namespace Engine 
{ 
    typedef std::shared_ptr<WorkItemResultData> WorkItemResultData_ptr; 
} 
+0

+1 для упоминания решения пространства имен – Ghita

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