2009-07-07 5 views
5

noob здесь все еще экспериментирует с шаблонами. Попытка написать шаблон класса обработки сообщенийШаблон класса внутри класса шаблон в C++

template <typename T> class MessageProcessor { 

    //constructor, destructor defined 
    //Code using t_ and other functions 
foo(void) { 

//More code in a perfectly fine method 
} 
    private: T *t_ 

}; 

Все определено в файле заголовка. Я построил и протестировал свой класс, и все хорошо. Теперь я пытаюсь сделать это:

template <typename T> class MessageProcesor { 

    //Same stuff as before 

foo(void) { 
//Same code as before in foo, but one new line: 
    t_->getMessageSender<MessageType>(); 

} 

private: T *t_; 
}; 

Однако эта линия дает мне ошибку плохого выражения типа перед «>» знак.

Я добавил необходимые файлы заголовков, чтобы определить, что такое MessageType. Я использовал эту функцию много раз раньше, просто не в этом контексте.

Я подозреваю, что компилятору не нравится тот факт, что функция шаблона полностью определена (специализирована?) В неопределенном шаблоне класса (неспециализирована?). Я не полностью разбираюсь в том, что делает шаблон «специализированным». Большинство объяснений сосредоточено на понятиях «полный» или «частичный», но не то, что делает его специализированным в первую очередь.

Извините, если вы хотите увидеть больше кода. У меня нет доступа к Интернету на работе, и именно здесь я это делаю, поэтому я должен все вставить в свой «блокнот» и принести его домой.

+2

Почтовый код функции getMessageSender здесь. –

+0

Пища не имеет типа возврата, это ваша проблема –

+0

Вы все правильно в своих наблюдениях. Однако это были опечатки. Фактическая проблема заключалась в отсутствии ключевого слова «шаблон», на который ответил Faisal – user106740

ответ

9

Ваша функция член «Foo» необходим тип возврата, вы должны использовать ключевое слово «шаблон» при использовании шаблонов членов в зависимых выражений (выражения, смысл полагаться прямо или косвенно на общий параметр шаблона)

t_->template getMessageSender<MessageType>(); // ok 
t_->getMessageSender<MessageType>(); // not ok 

Возможно, этот пример поможет вам оценить, когда шаблон элемента нуждается в, чтобы префикс ключевого слова 'template' [Примечание: в интересах симметрии вы всегда можете использовать префикс «шаблон» на шаблонах членов, но это необязательно при использовании в независимом выражении.

struct MyType 
{ 
    template<class T> void foo() { } 
}; 

template<class U> 
struct S 
{ 
    template<class T> 
    void bar() 
    { 
    MyType mt; // non-dependent on any template parameter 
    mt.template foo<int>(); // ok 
    mt.foo<int>(); // also ok 

    // 't' is dependent on template parameter T 
    T t; 
    t.template foo<int>(); // ok 
    t.foo<int>(); // not ok 

    S<T> st; // 'st' is dependent on template parameter T 
    st.template foo<int>(); // ok 
    st.foo<int>(); // not ok 


    S<MyType> s; // non-dependent on any template parameter 
    s.bar<int>(); // ok 
    s.template bar<int>(); // also ok 

    } 

}; 

Надеюсь, что это поможет.

+0

На каком компиляторе вам нужно это сделать? –

+0

@Edouard. Стандарт требует префикса «шаблон» только при доступе к шаблонам-членам из идентификатора, который зависит от параметра шаблона - большинство компиляторов должны получить это право, поскольку это было частью стандарта с «98» в «03», которое они модифицировали правила для простоты, чтобы вы могли использовать его во всех доступах к шаблонам членов - и асиде из компиляторов EDG (которые в основном получают это право), я не проверял его ни на одном из других компиляторов - пожалуйста, позвольте мне узнайте, есть ли у вас. –

0

Вероятно, MessageType не известен в этой точке. Вы пропускаете включение, разрешение пространства имен или декларацию?

если tht не так, как есть getMessageSender заявлено, и как MessageType?

Как правило, в C++ это не проблема, если T не известно в этой точке (ну ... это сложно, но все же).

Кроме того, сообщение об ошибке обычно содержит тип, для которого он пытается быть надуманным. Попытайтесь опубликовать полное сообщение об ошибке как минимум.

0

Есть ли у вас другие подобные вызовы для методов, таких как getMessageSender, которые templatized?

t_->getMessageSender<MessageType>(); 
2

Добавить ключевое слово template между -> и имя метода шаблона:

t_->template getMessageSender<MessageType>(); 
0

Это просто возвращаемый тип вашей функции, которая отсутствует. Элемент t_ полностью определен.

Специализация шаблона - это «специальная» версия вашего инструментария для конкретных аргументов шаблона. Пример: std::vector - это специализированная версия общего кода std::vector.

Частичная специализация - это реализация вашего общего кода, где предоставляются не все аргументы шаблона.

0

Это отлично работает в компиляторе Visual Studio 2010.

class One 
{ 
public: 
    void newFoo() ; 
    template < class T > void foo() 
    { 
     T obj ; // obj is dependent on template parameter 
     obj.newFoo() ; // and this works 
    } 
} 

Просто чтобы обновить ответ!

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