Шаблоны с неявными параметрами, предварительное объявление, C ++ - PullRequest
8 голосов
/ 05 февраля 2011

Существует объявление класса шаблона с неявными параметрами:

List.h

template <typename Item, const bool attribute = true>
class List: public OList <item, attribute>
{
    public:
    List() : OList<Item, attribute> () {}
    ....
};

Я попытался использовать декларацию перемотки вперед в другом заголовочном файле:

Analysis.h

template <typename T, const bool attribute = true>
class List;

Но G ++ показывает эту ошибку:

List.h:28: error: redefinition of default argument for `bool attribute'
Analysis.h:43: error:   original definition appeared here

Если я использую прямое объявление без неявных параметров, то

template <typename T, const bool attribute>
class List;

компилятор непринять эту конструкцию

Analysis.h

void function (List <Object> *list)
{
}

и отображает следующую ошибку (т.е. не принимает неявное значение):

Analysis.h:55: error: wrong number of template arguments (1, should be 2)
Analysis.h:44: error: provided for `template<class T, bool destructable> struct List'
Analysis.h:55: error: ISO C++ forbids declaration of `list' with no type

Обновленный вопрос:

Я удалил параметр по умолчанию из определения шаблона:

List.h

template <typename Item, const bool attribute>
class List: public OList <item, attribute>
{
    public:
    List() : OList<Item, attribute> () {}
    ....
};

Первый файл, использующий класс List, имеет прямое объявление с неявным значениематрибута параметра

Analysis1.h

template <typename T, const bool attribute = true>
class List;  //OK

class Analysis1
{
    void function(List <Object> *list); //OK
};

Второй класс, использующий класс List с прямым определением, использующий неявное значение

Analysis2.h

template <typename T, const bool attribute = true> // Redefinition of default argument for `bool attribute'
class List; 

class Analysis2
{
    void function(List <Object> *list); //OK
};

Второй класс использует класс List БЕЗ прямого определенияион, использующий неявное значение

Analysis2.h

template <typename T, const bool attribute> // OK
class List; 

class Analysis2
{
    void function(List <Object> *list); //Wrong number of template arguments (1, should be 2)
};

Ответы [ 5 ]

5 голосов
/ 05 февраля 2011

Simple.Удалите значение по умолчанию из определения, поскольку вы уже упомянули это в предварительной декларации.

template <typename Item, const bool attribute = true> //<--- remove this 'true`
class List: public OList <item, attribute>
{
  //..
};

Запись:

template <typename Item, const bool attribute>  //<--- this is correct!
class List: public OList <item, attribute>
{
  //..
};

Демонстрация в сети: http://www.ideone.com/oj0jK

2 голосов
/ 05 февраля 2011

Возможное решение - объявить другой заголовочный файл, List_fwd.h

template <typename Item, const bool attribute>
class List;

Так что в List.h и Analysis.h вы включаете List_fwd.h в начале.Так List.h становится

#include "List_fwd.h"

template <typename Item, const bool attribute = true>
class List: public OList <item, attribute>
{
    public:
    List() : OList<Item, attribute> () {}
    ...
};

И Analysis.h

#include "List_fwd.h"
1 голос
/ 05 февраля 2011

Вы должны убедиться, что только первое объявление имеет значение параметра по умолчанию.Это может быть достигнуто путем определения заголовка только для предварительного объявления, а затем включения его из List.h и Analysis.h.В определение в List.h не включайте значение по умолчанию.

0 голосов
/ 05 февраля 2011

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

0 голосов
/ 05 февраля 2011

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

для форварда не требуется параметр по умолчанию (в некоторых случаях его нужно будет просто ввести).

Вы можете создать другой простой тип шаблона, который реализует это вместе с форвардом, если вы действительно хотите параметр по умолчанию. затем вы получаете доступ к результату через typedef. Вы можете сделать это с помощью форварда List.

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