Неправильное использование неполного типа на g ++ - PullRequest
8 голосов
/ 17 февраля 2010

У меня есть два класса, которые зависят друг от друга:

class Foo; //forward declaration

template <typename T>
class Bar {
  public:
    Foo* foo_ptr;
    void DoSomething() {
      foo_ptr->DoSomething();
    }
};

class Foo {
  public:
    Bar<Foo>* bar_ptr;
    void DoSomething() {
      bar_ptr->DoSomething();
    }
};

Когда я компилировал его в g ++, он выдавал ошибку «Недопустимое использование неполного типа», но он был красиво скомпилирован в MSVC 10Возможно ли решить эту проблему, сохранив объявление и определение в одном заголовочном файле?(без файлов cpp) Если это не разрешено в стандарте, то является ли это «ошибкой» или «функцией» MSVC?

Ответы [ 3 ]

8 голосов
/ 17 февраля 2010

Да, просто переместите определения методов из определения класса:

class Foo; //forward declaration

template <typename T>
class Bar {
  public:
    Foo* foo_ptr;
    void DoSomething();
};

class Foo {
  public:
    Bar<Foo>* bar_ptr;
    void DoSomething() {
      bar_ptr->DoSomething();
    }
};

// Don't forget to make the function inline or you'll end up
// with multiple definitions
template <typename T>
inline void Bar<T>::DoSomething() {
  foo_ptr->DoSomething();
}
0 голосов
/ 06 сентября 2017

Работает, когда вы заменяете Foo* foo_ptr; на параметр шаблона T, чтобы вы получили T* foo_ptr;. В этом foo_ptr не обязательно должен быть указателем или быть предопределенным.

template <typename T>
class Bar {
  public:
    T foo;
    void DoSomething() {
      foo.DoSomething();
    }
};

class Foo {
  public:
    Bar<Foo>* bar_ptr;
    void DoSomething() {
      bar_ptr->DoSomething();
    }
};
0 голосов
/ 17 февраля 2010

Смотрите эту страницу: Как лучше всего обращаться с совместно зависимыми классами в C ++?

Это должно прояснить проблему и предоставить пару хороших решений.

...