Ошибка компиляции - Статический член - PullRequest
1 голос
/ 27 мая 2011

У меня есть определение класса с виртуальным методом.

При компиляции появляется ошибка, что 'MethodType Class::Method' не является статическим членом класса Class

Самое популярное решение, которое я нашел, - добавить ключевое слово static в определение метода в заголовочном файле.

Однако метод определен как virtual . Поэтому для добавления ключевого слова static мне придется удалить ключевое слово virtual . К сожалению, этого нельзя сделать, поскольку класс наследует от родителя, где этот метод также объявлен virtual , что приводит к другой ошибке компилятора. (Обратите внимание, я использую определенные интерфейсы и не имею доступа к исходному коду родительского класса)

У кого-нибудь есть идеи?


Заголовочный файл:

class X : public OtherClass
{
   public:
      X();
      ~X();  

     virtual structType MethodName(ParamType1,ParamType2);

};

Тогда в файле CPP у меня есть:

structType * X::MethodName(ParamType1 P1, ParamType2 P2)
{
   //Implementation here
}

И это помечается ошибкой:

'structType* X::MethodName' is not a static member of 'class X'

Ответы [ 3 ]

3 голосов
/ 27 мая 2011

Я думаю, что у вас ошибка синтаксического анализа.

В вашем определении класса написано:

class X : public OtherClass {
   public:
      X();
     ~X();
     virtual structType MethodName(ParamType1,ParamTYpe2);
}; 

Но у вашего определения MethodName другой тип возвращаемого значения:

structType* X::MethodName(ParamType1 P1, ParamType2 P2) {
    //Implementation here
}

Компилятор не совсем уверен, что с этим делать, и думает, что вы по какой-то причине пытаетесь что-то сделать с несуществующим статическим членом.

Решение состоит в том, чтобы исправить определение вашей функции иобъявление, чтобы у функции был один, единственный, согласованный тип возвращаемого значения.Либо structType, либо structType*.

3 голосов
/ 27 мая 2011

Вы должны сделать это static, если хотите вызвать метод без объекта этого класса .Это не имеет смысла для виртуальных методов.
Вы должны создать объект этого класса и затем вызвать метод.

struct X {
   static int bar();
   int foo();

};

X::bar(); // Works, static method called
X::foo(); // Doesn't work (your problem)

X x;
x.bar(); // Works, but X::bar() recommended (so that one sees that it's static...)
x.foo(); // Works, your solution
0 голосов
/ 01 июня 2011

Разобрался.

Наконец-то. В реализации MethodName1

     structType * X::MethodName(ParamType1 P1, ParamType2 P2)

ParamType1 был нестандартным типом. Это на самом деле класс в базовом приложении к которому у меня есть только API.

Оказывается, что реализация для класса ParamType1 отсутствовала / не скомпилирована / что-то.

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

Спасибо за помощь снова всем.

...