Предварительное объявление шаблона класса с ++

0

Я видел похожие примеры, но не понял их полностью, поэтому, пожалуйста, не отмечайте это как дубликат сразу. Я думаю, что есть простое решение для моей проблемы, и я только изучаю C++.

Я хочу использовать:

template<class T, std::size_t N>
class arnas_array {
//a copy of std:array functionality, basically, here.
};

в другом заголовке класса, другой файл, например:

class options_databaze {

public:

    struct options_to_save{
        arnas_array<char, 123> option_name;
        //char option_name[103];
        int * option_value_pointer; 
    };


};

И я не могу заставить его работать. Форвардное объявление вроде этого не будет работать:

template<class T, std::size_t N>
class arnas_array;

Я мало знаю об этой проблеме, первый раз, когда я застрял здесь, любые примеры - это золото.

error C2079: 'options_databaze::options_to_save::option_name' uses undefined class 'arnas_array<char,123>'
  • 2
    Ваше предварительное объявление на самом деле прекрасно, но вы не можете использовать объявленный заранее класс, чтобы объявить член этого типа, пока класс не будет полностью определен (потому что в противном случае компилятор не сможет определить размер члена и, следовательно, размер struct options_to_save ). Однако вы можете объявить элемент, который является указателем на этот тип (указатели данных имеют одинаковый размер независимо от их типа). (И вам не хватает ; в конце определения вашего класса, но я уверен, что это просто ошибка копирования-вставки.)
  • 0
    Как я должен избегать предварительных объявлений и использовать один и тот же класс в каждом файле? я не хотел бы менять свой код, чтобы использовать указатели, я редактирую приложение, не пишу новый код в этой ситуации
Показать ещё 3 комментария
Теги:

1 ответ

1
Лучший ответ

Вопрос не имеет ничего общего с шаблонами. В C++ тип класса T должен быть полным, в частности, если объявлен член данных нестатического класса типа T (см. Раздел 3.2/5 (One definition rule) стандарта или читайте более читаемую человеком версию здесь).

"Должно быть полным" означает, что определение класса T должно предшествовать определению соответствующего элемента данных. Общим способом достижения этой цели, как отметил Кэмерон в комментариях, является определение определения в файле заголовка и включение этого заголовка везде, где нужно - точно так же, как и при использовании стандартных заголовков, таких как <vector>, <map> и т.д.

  • 0
    спасибо, так как этот класс уже был в заголовке (который имел все определения и 2 других небольших класса, это как "основной" заголовок штук), я подумал, что это не так, поскольку у меня был включен этот заголовок. Но похоже, что отдельный заголовок с определенным классом arnas_array все исправил.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню