2009-11-26 2 views
1

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

Примечание: Этот вопрос является производным от How can a C++ base class determine at runtime if a method has been overridden?

class MyClass 
{ 
     typedef void (MyClass::*MethodPtr)(); 


     virtual void Method() 
     { 
       MethodPtr a = &MyClass::Method; // legal 
       MethodPtr b = &Method; // error C2276: ‘&’ : illegal operation on bound member function expression 

       if (a == b)  // this method has not been overridden? 
         throw “Not overridden”; 
     } 
}; 

ответ

12

ISO C++ запрещает принимать адрес неквалифицированным или скобки, не статическую функцию-член, чтобы сформировать указатель на функцию-член. Это позаботится об изменении имени. Поэтому то, что вы пытаетесь сделать, не будет работать в компиляторе C++, совместимом со стандартами.

+0

Если бы вы могли это сделать, C++ имел бы что-то вроде [закрытия] [1]. [1]: http://ru.wikipedia.org/wiki/Closure_%28computer_science%29 –

+0

@Conrad Meyer http://en.wikipedia.org/wiki/Function_object#In_C_and_C.2B.2B –

Смежные вопросы