2010-01-17 22 views
6

Tengo lo siguiente en el archivo de encabezado.Referencia no definida a la función no miembro - C++

namespace silc{ 
    class pattern_token_map 
    { 
     /* Contents */ 
    }; 

    pattern_token_map* load_from_file(const char*); 
} 

En el archivo CPP (esto tiene adecuado incluye)

pattern_token_map* load_from_file(const char* filename) 
{ 
    // Implementation goes here 
} 

En otro archivo CPP. Esto tiene todos los adecuados incluye.

void some_method() 
{ 
    const char* filename = "sample.xml"; 
    pattern_token_map* map = load_from_file(filename); // Linker complains about this. 
} 

estoy recibiendo un error de vinculador diciendo que referencia indefinida a load_from_file. No puedo ver qué está pasando mal aquí.

Cualquier ayuda sería apreciada.

Compilador: G ++ OS: Ubuntu 9.10

Editar

Este es el comando enlazador utilizado.

g++ -L/home/nkn/silc-project/third_party/UnitTest++ -o tests.out src/phonetic_kit/pattern_token_map.o tests/pattern_token_map_tests.o tests/main.o -lUnitTest++ 

de error es de pattern_token_map_tests.o y la función está disponible en pattern_token_map.o. Así que supongo que el orden de los enlaces no está causando el problema. (He eliminado algunos archivos del comando para simplificarlo)

+0

¿Echas de menos los parens en 'some_method'? –

+1

Imposible distinguir entre lo que ha publicado, agregue el comando compilador/vinculador que está utilizando. –

+0

Gracias Neil. He agregado el comando linker que estoy usando. Es una versión simplificada de lo que tengo. –

Respuesta

9

Cuando se implementa, usted tiene que asegurarse de que implemente la función derecha:

namespace silc { 
pattern_token_map* load_from_file(const char* filename) { 
    // Implementation goes here 
} 
} 

Si en vez hecho esto:

using namespace silc; // to get pattern_token_map 
pattern_token_map* load_from_file(const char* filename) { 
    // Implementation goes here 
} 

entonces sería definir una nueva función en lugar de silc :: load_from_file.

Evitar el uso de directivas ("using namespace ...;") fuera del ámbito de la función, como pauta general:

using namespace silc; // outside function scope: avoid 

silc::pattern_token_map*      // qualify return type 
random_function(silc::pattern_token_map* p) { // and parameters 
    using namespace silc; // inside function scope: fine 
    pattern_token_map* p2 = 0; // don't have to qualify inside the function 
          // if you want to use the using directive 
    silc::pattern_token_map* p3 = 0; // but you can always do this 
    return 0; 
} 
+0

Gracias. Al decir "Evitar el uso de directivas (" using namespace ...; ") fuera de las funciones.", ¿Quiere decir que evite escribirlo encima de los archivos cpp? Escríbalo dentro de cada función en su lugar. ¿Es eso lo que querías decir? –

+1

Sí, si quieres usarlo dentro de una función, está bien. Raramente lo necesita de todos modos, ya que puede usar el formulario en mi primer código para implementar sus funciones en archivos cpp. –

+1

No había pensado en restringir las directivas 'using' a cuerpos de funciones internas. +1 –

0

En su fase de enlace, ¿está enlazando en el archivo objeto creado mediante la compilación del primer archivo cpp? Los errores del enlazador como estos ocurren cuando un objeto hace referencia a un símbolo que no está incluido en los objetos que se vinculan.

Editar: Estoy razonablemente seguro de que este es el problema. En el primer archivo, ¿hay algún símbolo preprocesador que redefina load_from_file?

+0

Sí. Estoy vinculando todos los archivos de objeto. Se agregó el comando del enlazador. Por favor échale un vistazo. –

Cuestiones relacionadas