2013-12-21 4 views
1

У меня есть класс с именем DrawerApp, содержащими функции _genericLoadFromFile, Runпередавая функции другой функции в пределах того же класса

Я хочу назвать каждый из функций _loadFromFileHelper, _loadFromBinHelper из функции Run ниже:

void DrawerApp::Run() 
{ 
    _genericLoadFromFile(_loadFromFileHelper); 
    _genericLoadFromFile(_loadFromBinHelper); 
} 

И _genericLoadFromFile выглядит следующим образом:

bool DrawerApp::_genericLoadFromFile(static bool (DrawerApp::*helperFunc)(string)) 
{ 
/* do some stuff */ 
    string fileName = 'Test'; 
    success = (this->*helperFunc)(fileName); 

} 

, но, к сожалению, я получаю следующее сообщение об ошибке:

DrawerApp::_loadFromFileHelper': function call missing argument list; 
use '&DrawerApp::_loadFromFileHelper' to create a pointer to member 

А также это предупреждение:

Warning 1 warning C4042: 'helperFunc' : has bad storage class 

Как выполнить это правильно? Я не понимаю, что я делаю неправильно. Спасибо

Редактировать

Когда я пытаюсь изменить его, как ошибка предлагает &DrawerApp::_loadFromFileHelper я получаю еще ошибки:

Error 2 error LNK2019: unresolved external symbol "private: bool __thiscall DrawerApp::_loadFromFileHelper(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z) referenced in function "private: void __thiscall DrawerApp::Run(void)" ([email protected]@@AAEXXZ)  

И

Error 3 error LNK1120: 1 unresolved externals 
+0

Вместо этого используйте статический полиморфизм (шаблоны) или простой старый полиморфизм. – Bathsheba

+0

Можете ли вы привести пример для последнего? –

+0

Это первая ошибка, действительно, ошибка компоновщика? Это больше похоже на ошибку компилятора. – razeh

ответ

0

Проблема была довольно глупый. Я не реализовать методы правильно (забыл поставить DrawerApp:: перед ними.

Извините за баловаться с головой :-)

0

Если предположить, что вспомогательные функции объявлены статическими, нет необходимости вызывать их как указатели функции-члена - их можно просто назвать обычными указателями функций, например попробуйте это полное, компилируемый и связываемый (хотя и не очень функциональный) пример:

#include <string> 

using namespace std; 

class DrawerApp { 
    public: 

    void Run() 
    { 
     _genericLoadFromFile(_loadFromFileHelper); 
     _genericLoadFromFile(_loadFromBinHelper); 
    } 

    static bool _loadFromFileHelper(string x) 
    { 
     return true; 
    } 

    static bool _loadFromBinHelper(string x) 
    { 
     return true; 
    } 

    bool _genericLoadFromFile(
      bool (*helperFunc)(string)) 
    { 
     /* do some stuff */ 
     string fileName = "Test"; 
     bool success = (*helperFunc)(fileName); 
     return success; 
    } 
}; 

int main() { 
    DrawerApp a; 
    a.Run(); 
    return 0; 
} 

Это также показывает, что не нужно, чтобы показать класс хранения в определении функции для _genericLoadFromFile().

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