Скажем, у меня есть 3 класса со следующей топологией, и фактический код выглядит примерно так:
// formal system.h
#pragma once
namespace nianyi {
class Proposition {
public:
class Term;
class Expression;
// Term::Value evaluate();
};
class Proposition::Term : public Proposition {
public:
class Variable;
class Value;
};
class Proposition::Term::Value : public Proposition::Term {
};
};
Легко видеть, что если я раскомментирую это объявление функции, компилятор будет жаловаться на- ранее определенный класс Value, и это действительно так:
error C2027: use of undefined type 'nianyi::Proposition::Term'
Но с другой стороны, класс Term
является производным от его базового класса Proposition
, что означает, что я не могу поместить его реализацию в базовом классе, поскольку он не является полным классом до завершения реализации, и неполный класс не может быть получен из.
Таким образом, помещая реализацию класса Term
как внутри, так и снаружикласс Proposition
приведет к ошибке компилятора.Внутренний вызван неполнотой базового класса, а внешний - неполнотой производной.
Итак ... как лучше это решить?
PS пожалуйста, прекратите говорить «вы должны завершить определение перед использованием класса» или «просто не делайте их вложенными».Для первых слов, , в этом вся проблема , просто сказать, что это не очень помогает;и что касается слов второго рода, я просто хотел сделать их вложенными, чтобы не раскрывать эти детали.