Шаблоны с неявными параметрами, предварительное объявление, C ++

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

List.h

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

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

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 WITH прямое определение us использование неявного значения

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)
};
8
задан Robo 5 February 2011 в 11:26
поделиться