motkot
@motkot
Программирование C#.

Как исправить проблему с неоднозначностью?

При попытке добавить drawSystem появляется ошибка. Такое ТОЛЬКО, если структура наследует и IInitSystem и IRunSystem

E0286 base class "JazzyEcs::IEcsSystem" is ambiguous

// структура DrawSystem

struct DrawSystem : JazzyEcs::IInitSystem,  JazzyEcs::IRunSystem {
	void Init() {
		std::cout << "WIN!!! 2" << std::endl;
	}

	void Run() {
		std::cout << "Run!!1111" << std::endl;
	}
};

// ---

// Добавление

DrawSystem drawSystem{};

initSystems.Add(&drawSystem); // ТУТЬ

// ---

// метод Add

void EcsSystems::Add(IEcsSystem* system) {
	_systems.push_back(system);

	if (IRunSystem* runSystem = static_cast<IRunSystem*>(system)) {
		_runSystems.push_back(runSystem);
	}
}

// ---

// Структуры EcsSystems

struct IEcsSystem{

};

struct IInitSystem : IEcsSystem {
	virtual void Init(void) { std::cout << "Init" << std::endl; }
};

struct IRunSystem : IEcsSystem {
	virtual void Run(void) { std::cout << "Run" << std::endl; }
};

// ---
  • Вопрос задан
  • 132 просмотра
Решения вопроса 2
Nipheris
@Nipheris Куратор тега C++
Virtual inheritance
struct IInitSystem : virtual IEcsSystem {
  virtual void Init(void) { std::cout << "Init" << std::endl; }
};

struct IRunSystem : virtual IEcsSystem {
  virtual void Run(void) { std::cout << "Run" << std::endl; }
};
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
void EcsSystems::Add(IEcsSystem* system) {
  _systems.push_back(system);

  if (IRunSystem* runSystem = static_cast<IRunSystem*>(system)) {
    _runSystems.push_back(runSystem);
  }
}

Это странное решение -- сначала потерять всю информацию о типе, а потом м помощью каста выяснять, а каким же он был. К тому же здесь очевидно имелся в виду dynamic_cast, потому что результат static_cast для не-NULL аргумента всегда будет отличным от NULL.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы