Вопрос

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

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.Я использовал эту функцию много раз раньше, но не в этом контексте.

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

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

Это было полезно?

Решение

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

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

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

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

  }

};

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

Другие советы

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

t_->template getMessageSender<MessageType>();

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

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

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

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

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

t_->getMessageSender<MessageType>();

Отсутствует просто тип возвращаемого значения вашей функции.А t_ член полностью определен.

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

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

Это отлично работает на компиляторе 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
    }
}

Просто чтобы держать ответ в курсе!!!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top