Проблема в том, что ваш прямой класс был объявлен в другом пространстве имен (в частности, в глобальном пространстве имен). Таким образом, виртуальный объект для переопределения - это другой символ с другим типом параметра.
Как написано, компилятор сопоставляет ConcreteClass
с предварительным объявлением, которое он видит в глобальном пространстве имен при объявлении в базе:
virtual bool Method001( const ConcreteClass &cc ) = 0;
Когда вы объявляете Method001
в ConcreteClass
:
virtual bool Method001( const ConcreteClass &cc );
компилятор сопоставляет cc
с MyCustomNamespace::ConcreteClass
, потому что это более точное соответствие.
Чтобы решить эту проблему, просто поместите вашу предварительную декларацию в правильное пространство имен:
namespace MyCustomNamespace {
class ConcreteClass;
}