función en línea de error del vinculador

Estoy tratando de usar en línea funciones miembro de una clase en particular. Por ejemplo, la declaración de la función y la aplicación sin inline es como tal:

en el archivo de encabezado:

int GetTplLSize();

en el .archivo cpp:

int NeedleUSsim::GetTplLSize()
{
    return sampleDim[1];
}

Por alguna razón que si pongo la palabra clave «inline» en uno de los de ejecución y declaración, así como en ambos lugares, me da errores del vinculador como se muestra:

 La creación de la biblioteca C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.x y el objeto C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.exp 
mexfunction.obj : error LNK2019: símbolo externo sin resolver "public: int __thiscall NeedleUSsim::GetTplLSize(void)" ([email protected]@@QAEHXZ) que se hace referencia en función de _mexFunction 
mexfunction.mexw32 : fatal error LNK1120: 1 externos sin resolver 

C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL: Error: Enlace de 'mexfunction.mexw32' error. 

Lo que se necesita con el fin de deshacerse de este error (es decir, ¿qué estoy haciendo mal en términos de la realización de estos en línea funciones miembro)?

InformationsquelleAutor stanigator | 2009-06-05

5 Kommentare

  1. 30

    Que usted necesita para poner definición de la función en el encabezado entonces. La forma más simple sugerencia de que el compilador en línea es para incluir el cuerpo del método en la declaración de la clase como:

    
    class NeedleUSsim
    {
      //...
      int GetTplLSize() const { return sampleDim[1]; }
      //...
    };

    o, si usted insiste en la declaración por separado y definición:

    
    class NeedleUSsim
    {
      //...
      int GetTplLSize() const;
      //...
    };
    
    inline int NeedleUSsim::GetTplLSize() const
    { return sampleDim[1]; }

    La definición tiene que ser visible en cada unidad de traducción que utiliza ese método.

    • Es esta la única manera? (Quiero separar la declaración y la aplicación por separado para mejorar la legibilidad razones)
    • Básicamente sí. El compilador tiene que conocer el cuerpo de la función, mientras que la compilación de las llamadas, por lo que el cuerpo tiene que ser incluido en el archivo de encabezado. Sin embargo, usted todavía puede declarar la función en la declaración de la clase y agregar la aplicación a un lugar más tarde en el archivo de encabezado.
    • Lo que yo veo. Supongo que tendría que vivir con escribir el código de esta manera a continuación. Gracias por los consejos.
    • Algunas personas les gusta poner funciones en línea en un archivo de cabecera aparte y que incluyen desde el archivo de encabezado principal (al final) en lugar de tenerlos en la cabecera principal. No estoy personalmente 100% convencido por ella (se siente como una pérdida de tiempo para mí), pero si te gusta, es otra opción.
    • Sí, yo no quería hablar de eso .inl patético técnica 🙂
    • Sólo la parte superior es el método de trabajo para mí en XCode 4.2. (sólo que sin const porque estoy tratando de crear un setter).Si puedo probar el segundo método no funciona
    • O colocar la definición dentro de la clase, entonces el inline palabra clave no es necesario porque la función es automática en línea.

  2. 25

    de C++ FAQ Lite

    Si pones la línea de la función del
    definición en una .archivo cpp, y si
    se llama de otra .archivo cpp,
    usted obtendrá una «unresolved external»
    error del vinculador.

    ¿Cómo decirle al compilador para que una función miembro en línea?

    • por desgracia, como me acabo de enterar de la manera difícil, este NO es el caso en MSVC 2013 y 2015. Yo tenía una línea en un archivo CPP (en una biblioteca), y su código fue llamado de algunos totalmente diferente CPP código fuente que tiene un en línea con el mismo nombre (pero ligeramente diferente código, por lo que el resultado hizo romper las pruebas). Creo que ese es un error en el entorno de desarrollo. Difícil de encontrar…
  3. 5

    Como otros ya han señalado, deberá mover la definición de la línea de la función a la cabecera del archivo, como:

    class NeedleUSsim
    {
      //...
      inline int GetTplLSize() { return sampleDim[1]; }
      //...
    };

    La razón de esto es que el compilador necesita saber qué código en línea cuando ve a una llamada a la línea de la función. Si se deja la definición de la función en el .archivo cpp para el NeedleUSsim de la clase, el código que genera el compilador de atrapado en el NeedleUSsim objeto de archivo. Como el compilador lee el código fuente—que nunca se asoma a otra clase de objetos de archivo—simplemente, no tiene manera de saber con qué código para reemplazar una llamada cuando está compilando otra .archivo cpp.

  4. 3

    Si usted tiene una función en línea que usted debe poner la definición en el archivo de encabezado.

    • He intentado poner la palabra clave inline en las definiciones en el archivo de encabezado y me sigue apareciendo el mismo error del vinculador.
    • No sólo la palabra clave inline, toda definición debe ir en el archivo de encabezado. Así, la mueva de su .archivo cpp en su .h archivo.
    • Definición, no de la declaración.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea