C ++ - Доступность против видимости - PullRequest
0 голосов
/ 29 ноября 2018

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

Следующий код явно не компилируется, но в идеале он должен быть.

B наследуетиз A с параметром шаблона Node, а Node является частным для B.

template<typename T>
class A {...};


template<typename T>
class B: public A<B<T>::Node> {
private:
    struct Node{ int x=42;};
};

Мои предположения были такими:

template<typename T>
class A {...};


template<typename T>
class B: public A<B<T>::N> {
private:
    struct Node{ int x=42;};
public:
    typedef Node N;
};

Я получаю Error: type/value mismatch at argument 1 in template parameter list for ‘template class A’ для обоих.

Я действительно потерян с этим, ваша помощь ценится.

1 Ответ

0 голосов
/ 29 ноября 2018

Проблема в том, что B<T>::Node нельзя использовать в этой строке, поскольку B<T> еще не завершено.Без полного определения B компилятор не может использовать вложенный тип.

Ошибка будет яснее, если вы используете:

template<typename T>
class B: public A<typename B<T>::Node> {
private:
    struct Node{ int x=42;};
};

При этом g ++ дает более понятныйошибка со следующим кодом.

template<typename T>
class A {};    

template<typename T>
class B: public A<typename B<T>::Node> {
private:
    struct Node{ int x=42;};
};

int main()
{
   B<int> b;
}

Ошибка компилятора:

socc.cc: In instantiation of ‘class B<int>’:
socc.cc:13:11:   required from here
socc.cc:6:7: error: invalid use of incomplete type ‘class B<int>’
 class B: public A<typename B<T>::Node> {
       ^
socc.cc:6:7: note: declaration of ‘class B<int>’
socc.cc: In function ‘int main()’:
socc.cc:13:11: warning: unused variable ‘b’ [-Wunused-variable]
    B<int> b;
           ^

Вы прокомментировали

Более конкретно проблема заключается в том, что Aэто дерево, а B массив, похожий на массив, который сохраняет в памяти мои определенные Node, используя структуру дерева.Поэтому контейнеру необходимо внутренне использовать дерево узлов.Я полагаю, что это более или менее распространенный дизайн для структур данных, так как обычно можно решить проблему?

Это требует агрегирования, а не наследования.

template<typename T>
class A { ... };


template <typename T>
class B {
   private:
      struct Node{ int x=42;};
      A<Node> data;
};
...