Шаблонный класс для не встроенных функций-членов - PullRequest
3 голосов
/ 14 июля 2011

Я пытаюсь следовать примеру здесь:

http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html

Но я не хочу совмещать определения моих функций с определением моего класса.

Буду ли я иметьпоставить

template<typename Data>
concurrent_queue<Data>::

перед всеми моими определениями функций и конструкторами?

Ответы [ 3 ]

3 голосов
/ 14 июля 2011

Да, вы будете, и определения все еще должны быть в заголовочном файле.Вот почему все используют встроенные определения, потому что они в любом случае должны быть встроенными.

2 голосов
/ 15 июля 2011

Да, нет никакого способа обойти этот синтаксис (кроме как с помощью генерирующих токены уничтожающих зло злых #define макросов).

Лично я либо вставляю их в объявление / определение шаблона класса, либо для лучшей самодокументирования помещаю определения в некоторый файл "inl", например, так:

foo.h

#ifndef FOO_H
#define FOO_H

namespace bar {

    template <typename T>
    class Foo {
    public:
        Foo () ;
        virtual ~Foo();
    };

}

#include "foo.inl.h"
#endif // FOO_H

foo.inl.h

#ifndef FOO_INL_H
#define FOO_INL_H

namespace bar {

template <typename T>
inline Foo<T>::Foo () {
}

template <typename T>
inline Foo<T>::~Foo () {
}

}
#endif // FOO_INL_H

Обратите внимание, что я явно объявляю их inline тогда. Это улучшает согласованность стиля, и если вам случится специализировать шаблон, вы должны сделать это в любом случае:

template <>
inline Foo<int>::Foo() {
}

Без inline вы испытываете ту же боль, что и при забывании его в обычных функциях, определенных в заголовочных файлах (читай: множественные ошибки определения).

0 голосов
/ 14 июля 2011

Функции не обязательно должны быть встроенными, но лучше, если они находятся внутри заголовочного файла:

/* in .h file */
template<class T>
class A
{
public:
   void f();
}

/* this also in .h file */
template<class T>
void A<T>::f()
{
}

Это часто необходимо для разделения класса и функций на отдельные части, но для работы шаблонов они оба должны быть в заголовочном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...