2011-01-22 2 views
38

Viene visualizzato un errore del compilatore quando provo a incorporare un metodo di una delle mie classi. Funziona quando togli la parola chiave "in linea".I metodi di classe di inlining del C++ causano un riferimento non definito

Ecco un esempio semplificato:

main.cpp:

#include "my_class.h" 

int main() { 
    MyClass c; 
    c.TestMethod(); 

    return 0; 
} 

my_class.h:

class MyClass { 
public: 
    void TestMethod(); 
}; 

my_class.cpp:

#include "my_class.h" 

inline void MyClass::TestMethod() { 
} 

cerco compilazione con:

g++ main.cpp my_class.cpp 

ottengo l'errore:

main.cpp:(.text+0xd): undefined reference to `MyClass::TestMethod()' 

Tutto va bene se prendo via il "inline". Cosa sta causando questo problema? (e come devo metodi di classe in linea? È possibile?)

Grazie.

risposta

33

Il corpo di una funzione inline deve essere nell'intestazione in modo che il compilatore possa effettivamente sostituirlo ovunque sia necessario. Vedere questo: How do you tell the compiler to make a member function inline?

+1

Il collegamento conduce alla pagina con "Non si dispone dell'autorizzazione per accedere al file richiesto su questo server". Errore –

3

L'hai definito come non inserito nel file di intestazione, mentre nel file cpp stai cercando di definirlo come in linea. Questa è una definizione conflittuale e non sarà in grado di trovarne una dall'altra. La tua intestazione è dove posizioni la parola chiave inline.

Tuttavia, rimuoverei la parola chiave inline in quanto è davvero più di un suggerimento per il compilatore comunque. Ne hai davvero bisogno solo quando c'è una funzione fluttuante nell'intestazione e non vuoi che diverse definizioni compaiano nella tua base di codice.

+0

'parole chiave inline' sono certamente non solo un suggerimento, almeno in C++, dicono al compilatore di rendere la definizione debole e di emetterla solo se necessario. Ciò significa che deve essere presente dove usato, ma d'altra parte può essere incluso più di una volta – bdonlan

+0

Ho ancora un errore, non importa dove ho messo il inline (o se ho messo in linea in entrambi). Tra le 4 combinazioni (inline in my_class.h e/o in my_class.cpp), funziona solo quella senza inline. – FrankMN

15

7.1.2/4 dello Standard:

An inline function shall be defined in every translation unit in which it is used...

si utilizza TestMethod in main.cpp, ma non è definito lì.

... If a function with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required.

si definisce (e quindi anche dichiarare) TestMethod inline in my_class.cpp, ma non in main.cpp.

La correzione in questo caso è quello di spostare la definizione di funzione al file di intestazione, sia in questo modo:

class MyClass { 
public: 
    void TestMethod() {} 
}; 

o come questo:

class MyClass { 
public: 
    inline void TestMethod(); 
}; 

inline void MyClass::TestMethod() {}