Шаблон C ++ Неполный тип с использованием указателя класса внутри шаблона - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь создать сетку. Насколько я понимаю, проблема заключается в использовании указателя на шаблонный класс внутри себя, который является законным, пока я не попытаюсь что-то с ним сделать, когда компилятор пожалуется.Я ищу способ использовать указатели на класс шаблона внутри себя для использования в указателях и делать то, что я буду позже.Я компилирую с g ++ версии 5, которую я использую командой компиляции: g ++ * .cpp -o main -std = c ++ 11 Ошибка, которую я получу, будет следовать за фрагментом кода.

struct Vector2D 
{
    Vector2D(  ) {  }
    Vector2D( int x , int y ): x( x ) , y( y ) {  } ;

    int x , y ; 

} ;

template <typename A>
class GridNode2D ; 

template <typename T>
class GridNode2D
{
public: 
    GridNode2D(  ) {  } ;
    T data ; 
    Vector2D coOrdinate ; 

    GridNode2D<T>* left, right, up, down ; 

} ;

template <typename T>
class Grid2D
{
public:
    Grid2D(  ) ;

    GridNode2D<T>* head ; 

} ;

template <typename T>
Grid2D<T>::Grid2D(  )
{
    this->head = new GridNode2D<T> ; 
    this->head->right = new GridNode2D<T> ; 

} ;

Ошибки:

main.cpp: In instantiation of ‘class GridNode2D<bool>’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',39)">main.cpp:39:16</span>:   required from ‘Grid2D<T>::Grid2D() [with T = bool]’
<span class="error_line" onclick="ide.gotoLine('main.cpp',47)">main.cpp:47:18</span>:   required from here
main.cpp:22:26: error: ‘GridNode2D::right’ has incomplete type
     GridNode2D<T>* left, right, up, down ; 
                          ^
main.cpp:15:7: note: definition of ‘class GridNode2D’ is not complete until the closing brace
 class GridNode2D
       ^
main.cpp:22:33: error: ‘GridNode2D::up’ has incomplete type
     GridNode2D<T>* left, right, up, down ; 
                                 ^
main.cpp:15:7: note: definition of ‘class GridNode2D’ is not complete until the closing brace
 class GridNode2D
       ^
main.cpp:22:37: error: ‘GridNode2D::down’ has incomplete type
     GridNode2D<T>* left, right, up, down ; 
                                     ^
main.cpp:15:7: note: definition of ‘class GridNode2D’ is not complete until the closing brace
 class GridNode2D

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Объявление

GridNode2D<T>* left, right, up, down ;

создает 1 указатель и 3 экземпляра.Измените его на

GridNode2D<T>* left, *right, *up, *down;

или даже

GridNode2D<T>* left = nullptr;
GridNode2D<T>* right = nullptr;
GridNode2D<T>* up = nullptr;
GridNode2D<T>* down = nullptr;
0 голосов
/ 28 января 2019

Размещение звездочки * в декларации

GridNode2D<T>* left, right, up, down ;

вводит в заблуждение.«Стандартный» способ декларации на языке C сделает его более понятным:

GridNode2D<T> *left, right, up, down ;

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

Поскольку другие переменные не являются указателями, вам необходимо полное определение GridNode2D<T>, чтобы иметь возможность определять экземпляры этого класса, но это невозможно, так какобъекты являются частью самого GridNode2D<T>.Что приводит к полученным ошибкам.

Либо используйте звездочку для всех переменных в объявлении, либо для лучшей читаемости разбейте объявления на несколько строк:

GridNode2D<T>* left;
GridNode2D<T>* right;
GridNode2D<T>* up;
GridNode2D<T>* down;
...