Pregunta

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

en el archivo de cabecera:

int GetTplLSize();

en el archivo .cpp:

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

Por alguna razón, si pongo la palabra clave "en línea" en cualquiera de la ejecución y la declaración, así como en ambos lugares, tengo errores de engarce como se muestra:

 Creating library C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.x and object C:\DOCUME~1\STANLEY\LOCALS~1\TEMP\MEX_HN~1\templib.exp 
mexfunction.obj : error LNK2019: unresolved external symbol "public: int __thiscall NeedleUSsim::GetTplLSize(void)" (?GetTplLSize@NeedleUSsim@@QAEHXZ) referenced in function _mexFunction 
mexfunction.mexw32 : fatal error LNK1120: 1 unresolved externals 

  C:\PROGRA~1\MATLAB\R2008B\BIN\MEX.PL: Error: Link of 'mexfunction.mexw32' failed. 

Lo que tiene que ser con el fin de deshacerse de este error (es decir, ¿qué estoy haciendo mal en términos de hacer estas funciones miembro en línea)?

¿Fue útil?

Solución

Es necesario poner definición de función en la cabecera continuación. La forma más sencilla de hacer alusión al compilador en línea es incluir un cuerpo de método en la declaración de clase como:


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

o, si insiste en 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 usa ese método.

Otros consejos

de C ++ FAQ Lite

  

Si coloca la función en línea de   definición en un archivo .cpp, y si   se llama desde algún otro archivo .cpp,   obtendrá un "externo no resuelto"   error del enlazador.

¿Cómo se le dice al compilador hacer una línea función miembro?

Como otros ya han señalado, tiene que mover la definición de la función inline en el fichero de cabecera, así:

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

La razón de esto es que el compilador necesita saber qué código inline cuando ve una llamada a la función inline. Si deja la definición de la función en el archivo .cpp de la clase NeedleUSsim, el código que genera el compilador para que queda atrapado en el fichero objeto NeedleUSsim. A medida que el compilador sólo lee el código fuente-nunca se asoma al objeto de otra clase de archivos que simplemente no tiene manera de saber con qué código para reemplazar una llamada cuando está compilando otro archivo .cpp.

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

Vea la rel="nofollow Guardia Inline lenguaje macro . Esto por lo menos permitirá separar, aunque ligeramente, el código de la declaración. También le permite alternar procesos en línea de las funciones a través de un define.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top