2016-10-18 5 views
0

code:fonction membre non statique reinterpret_cast n'a

#include <iostream> 

using namespace std; 

struct item 
{ 
    int f1() {} 
    double f2() {} 

    static int g1() {} 
    static double g2() {} 

    void f0(); 
}; 
void item::f0() 
{ 
    auto c1 = reinterpret_cast<decltype(f2)>(f1); 
    auto c2 = reinterpret_cast<decltype(g2)>(g1); 

    auto c3 = reinterpret_cast<decltype(&f2)>(f1); 
    auto c4 = reinterpret_cast<decltype(&g2)>(g1); 
} 
int main() 
{ 
    cout << "Hello world!" << endl; 
    return 0; 
} 

message d'erreur:

main.cpp|17|error: invalid use of non-static member function| 
main.cpp|18|error: invalid cast from type ‘int (*)()’ to type ‘double()’| 
main.cpp|20|error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say ‘&item::f2’ [-fpermissive]| 
main.cpp|20|error: invalid use of member function (did you forget the ‘()’ ?) 

ma question: Les fonctions membres passés comme arguments seront automatiquement converties en pointeur, donc j'essayer couler la argument à un pointeur, mais toujours échoué. Je ne comprends pas pourquoi la fonction de membre non statique ne fonctionne pas dans toutes les situations .

Répondre

0

Vous devez convertir la valeur de retour f1 et non f1. Utilisation:

auto c1 = reinterpret_cast<decltype(f2())>(f1()); 
               ^^ Call the function 

Apporter des modifications similaires aux autres lignes.

J'ai mal compris ce que vous essayiez de faire. Ce qui suit devrait fonctionner:

auto c1 = reinterpret_cast<decltype(&item::f2)>(&item::f1); 
    auto c2 = reinterpret_cast<decltype(&g2)>(g1); 

    auto c3 = reinterpret_cast<decltype(&item::f2)>(&item::f1); 
    auto c4 = reinterpret_cast<decltype(&g1)>(g2); 

f1 est une fonction non static membre. Vous pouvez l'appeler en utilisant f1(). Toutefois, sans la syntaxe d'appel de fonction, les fonctions de membre non statiques ne se désintègrent pas automatiquement en un pointeur de fonction membre. Pour obtenir un pointeur de fonction membre du struct, vous devez utiliser &item::f1.

+0

Je veux que c1 soit une fonction, à part reinterpret_cast ne peut pas convertir int pour doubler – lnvm

+0

@ Gr.Five, voir la réponse mise à jour. –

+0

@R Sahu, merveilleux! Cela fonctionne, mais pourriez-vous expliquer pourquoi? – lnvm