Я видел похожие примеры, но не понял их полностью, поэтому, пожалуйста, не отмечайте это как дубликат сразу. Я думаю, что есть простое решение для моей проблемы, и я только изучаю 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>'
Вопрос не имеет ничего общего с шаблонами. В C++ тип класса T
должен быть полным, в частности, если объявлен член данных нестатического класса типа T
(см. Раздел 3.2/5 (One definition rule)
стандарта или читайте более читаемую человеком версию здесь).
"Должно быть полным" означает, что определение класса T
должно предшествовать определению соответствующего элемента данных. Общим способом достижения этой цели, как отметил Кэмерон в комментариях, является определение определения в файле заголовка и включение этого заголовка везде, где нужно - точно так же, как и при использовании стандартных заголовков, таких как <vector>
, <map>
и т.д.
struct options_to_save
). Однако вы можете объявить элемент, который является указателем на этот тип (указатели данных имеют одинаковый размер независимо от их типа). (И вам не хватает;
в конце определения вашего класса, но я уверен, что это просто ошибка копирования-вставки.)