C ++: инициализация шаблона конструктора / подпрограммы объявлена ​​в заголовочном файле? - PullRequest
0 голосов
/ 22 октября 2011

У меня есть шаблон, определенный в моем заголовочном файле следующим образом:

 template<typename T> class BoundedBuffer {
    unsigned int size;
    T entries[];
  public:
    BoundedBuffer( const unsigned int size = 10 );
    void insert( T elem );
    T remove();
};

Однако, когда я пытаюсь инициализировать конструктор:

BoundedBuffer<T>::BoundedBuffer( const unsigned int size = 10 ) size(size) {
    // create array of entries
    entries = new T[size];

    // initialize all entries to null
    for(int i = 0; i < size; i++)
        entries[i] = null;
}

Я получаю следующую ошибку (первая строка предыдущего блока кода - 17):

q1buffer.cc:17: error: âTâ was not declared in this scope
q1buffer.cc:17: error: template argument 1 is invalid
q1buffer.cc:17: error: expected initializer before âsizeâ

Ответы [ 3 ]

4 голосов
/ 22 октября 2011

Правильный синтаксис:

template <typename T>
BoundedBuffer<T>::BoundedBuffer(const unsigned int size) : size(size) {
    // create array of entries
    entries = new T[size];

    // initialize all entries to null
    for(int i = 0; i < size; i++)
        entries[i] = null;
}

Обратите внимание, что необязательные параметры должны быть объявлены не в определениях функций, а только в объявлениях функций.

class aaa
{
    // declaration
    void xxx(int w = 10);
};

// definition
void aaa::xxx(int w)
{
    ...
}

Обратите внимание, что все для шаблонного класса должно оставаться в файлах H.

"Они должны находиться в одном и том же модуле перевода. В некоторых библиотеках довольно распространено разделять реализацию шаблона на файл .tpp (или другое расширение), который затем включается в .h, где шаблон объявляется. " как сказал Майкл Прайс.

Шаблоны не являются обычными типами и не могут быть связаны. Они создаются только по запросу.

Обратите внимание, что инициализаторам полей конструкторов необходим символ ":".

class MyClass
{
public:
    int x;

    MyClass() : x(10) { /* note that i used : character */ }
};
1 голос
/ 22 октября 2011

Ваше объявление должно быть:

template< typename T >
BoundedBuffer<T>::BoundedBuffer( const unsigned int size ) : size( size ) {...}

Обратите внимание, что оно также должно быть в заголовочном файле, как упомянуто @Dean Povey.

1 голос
/ 22 октября 2011

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

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