Явная квалификация в декларации

battleutils.cpp: 1037: ошибка: явная квалификация в объявлении 'int32 battleutils:: AbilityBenediction (CBattleEntity *, CBattleEntity *)'

Что означает эта ошибка?

Первая строка здесь - 1037 (в battleutils.cpp):

int32 battleutils::AbilityBenediction(CBattleEntity* PCaster, CBattleEntity* PTarget)
{
      ....
      return blah;
}

В файле заголовка:

namespace battleutils
{

:

    int32   AbilityBenediction(CBattleEntity* PCaster, CBattleEntity* PTarget);

Файл .cpp правильно содержит файл заголовка.

Ответы

Ответ 1

Вы не можете объявлять (или определять) объекты, которые принадлежат пространству имен за пределами их пространства имен. Сделайте это:

 namespace foo { void bar() {} }

не это:

 void foo::bar() {} // not legal

РЕДАКТИРОВАНИЕ Вышеупомянутое неверно, вы можете определить объект за пределами его пространства имен, если его объявление в пространстве имен было замечено. Для этой ошибки должна быть другая причина.

Ответ 2

Я столкнулся с той же проблемой. У меня был источник, скомпилированный с использованием MS Visual Studio, но с помощью g++ в Linux он дал мне:

... error: explicit qualification in declaration of '...

Похоже, эта ошибка возникает, когда реализация уже находится внутри namespace foospace {...}, и реализация снова возвращает пространство имен int foospace::barfunction(int blah){return 17;}.

В принципе, если реализация (код в файле .cpp) уже находится внутри namespace foospace {...}, тогда удалите foospace:: из определения функции.

Ответ 3

Ну, это не ответ на этот конкретный вопрос, но поскольку это первый результат поиска Google при поиске этого сообщения об ошибке, я просто могу сказать, что получил это сообщение об ошибке, когда я дважды объявил пространство имен (когда не нужно) - вот так

error: явная квалификация в объявлении...

namespace foo {

    // REMOVE THIS "foo::" from here
    void foo::myFunction(int x) {
        // ...
    }

}

Ошибка начинающего. Проверьте пространства имен.