Почему C2259, когда проблема совершенно другая по природе? - PullRequest
0 голосов
/ 25 сентября 2018

При попытке скомпилировать фрагмент ниже, я получил сообщение об ошибке:

error C2259: 'cTest': cannot instantiate abstract class
note: due to the following members:
note: void iTest::log(iTest::eLevel): is abstract
note: see declaration of 'iTest::log'

Функция абстрактного члена была определена с той же сигнатурой.

Удаление второго перечисления решаетпроблема, хотя, это не было предназначено так или иначе.

Но все же я не знаю, почему дается C2259, и я могу только найти, что элемент должен быть определен для исправления.

class iTest
{
public:
    enum eLevel
    {
        Info,
    };
    virtual void foo( eLevel l ) = 0;
};

class cTest : public iTest
{
public:
    enum eLevel
    {
        Info,
    };
    virtual void foo( eLevel l )
    {
    }
};

int main()
{
    iTest* t = new cTest();
}

1 Ответ

0 голосов
/ 28 сентября 2018

Причина, по которой вы получаете эту ошибку, заключается в том, что второе определение iTest::foo и cTest::foo не имеет одинаковую подпись и, следовательно, ctest не реализует iTest::foo.

с полными именами.ваши объявления выглядят следующим образом:

class iTest
{
public:
    enum eLevel
    {
        Info,
    };
    virtual void foo( iTest::eLevel l ) = 0;
};

class cTest : public iTest
{
public:
    enum eLevel
    {
        Info,
    };
    virtual void foo( cTest::eLevel l )
    {
    }
};

Как можно видеть, foo(iTest::eLevel) - это не то же самое, что foo(cTest::eLevel), поэтому cTest все еще является абстрактным классом и не может быть создан в качестве экземпляра.

Вы можете полностью удалить cTest::eLevel или объявить cTest::foo как

class cTest : public iTest
{
public:
    enum eLevel
    {
        Info,
    };
    virtual void foo( iTest::eLevel l )
    {
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...