2014-12-05 4 views
0

Я видел похожие примеры, но не понял их полностью, поэтому, пожалуйста, не отмечайте это как дубликат сразу. Я думаю, что есть простое решение для моей проблемы, и я только изучаю C++.Передовая декларация класса шаблона 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'). Однако вы можете объявить элемент, который является указателем на этот тип (указатели данных имеют одинаковый размер независимо от их типа). (И вам не хватает ';' в конце определения вашего класса, но я уверен, что это просто ошибка с копированием и вставкой.) – Cameron

+0

Как мне избежать последующих объявлений и использовать один и тот же класс в каждом файле? я бы не хотел менять свой код, чтобы использовать указатели, im, редактируя приложение, не записывая новый код в этой ситуации. – Tomas

+2

В качестве подсказки всегда указывайте фактические сообщения об ошибках, которые вы получаете при попытке скомпилировать код при отправке – harmic

ответ

2

Вопрос не имеет никакого отношения к шаблонам. В C++ тип класса T должен быть завершен, в частности, если объявлен член данных нестатического класса типа T (см. Раздел стандарта или номер more human-readable version here).

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

+0

спасибо, так как этот класс уже был в заголовке (который имел все определения и другие 2 небольших класса, его как «главный» заголовок предметов). Это не так, так как я включил этот заголовок. Но похоже, что отдельный заголовок с определенным классом arnas_array фиксировал все. – Tomas

Смежные вопросы