erreur de linker de la fonction inline

j'essaie d'utiliser les fonctions de membre inline d'une classe particulière. Par exemple, la déclaration de fonction et la mise en œuvre sans lining est comme telle:

dans le fichier d'en-tête:

int GetTplLSize();

dans le .fichier cpp:

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

Pour une raison que si je mets le mot clé "inline" dans soit un de la mise en œuvre et de la déclaration, ainsi que dans les deux endroits, j'obtiens des erreurs d'édition de liens:

 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)" ([email protected]@@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. 

Que Faut-il faire pour se débarrasser de cela? erreur (i.e. qu'est-ce que je fais de mal en termes de faire ces fonctions de membre inline)?

24
demandé sur stanigator 2009-06-05 04:06:20
la source

5 ответов

vous devez mettre la définition de la fonction dans l'en-tête alors. La façon la plus simple d'indiquer le compilateur à inline est d'inclure le corps de la méthode dans la déclaration de classe comme:


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

ou, si vous insistez sur la déclaration et la définition:


class NeedleUSsim
{
  // ...
  int GetTplLSize() const;
  // ...
};

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

La définition doit être visible dans chaque unité de traduction qui utilise cette méthode.

25
répondu Nikolai Fetissov 2009-06-05 06:06:58
la source

from C++ FAQ Lite

si vous mettez les fonctions en ligne définition dans un .fichier cpp, et si il est appelé à partir de certains autres .fichier cpp, vous obtiendrez un "externe non résolu" erreur de l'éditeur de liens.

Comment dire au compilateur de faire fonctionner un membre en ligne?

21
répondu young 2017-11-15 14:15:32
la source

Comme d'autres l'ont déjà souligné, vous devez déplacer la définition de la fonction inline à l'en-tête de fichier, comme ceci:

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

la raison en est que le compilateur doit savoir quel code mettre en ligne quand il voit un appel à la fonction inlined. Si vous laissez la définition de la fonction dans les .fichier cpp pour la classe NeedleUSsim, le code que le compilateur génère pour lui est piégé dans le fichier objet NeedleUSsim. Comme le compilateur ne lit que source code-il ne jette jamais un coup d'oeil dans le fichier objet d'une autre classe-il n'a tout simplement aucun moyen de savoir avec quel code remplacer un appel quand il en compile un autre .fichier cpp.

4
répondu Ken Dyck 2009-06-05 05:00:24
la source

Si vous avez une fonction inline, vous devriez mettre la définition dans le fichier d'en-tête.

3
répondu Stephen Nutt 2009-06-05 04:09:02
la source

voir le Inline Garde Macro idiome. Cela permettra au moins de vous en séparer, quoique légèrement, le code de la déclaration. Il vous permet également de basculer l'inclinaison des fonctions via un define.

0
répondu grepsedawk 2016-07-22 07:21:05
la source

Autres questions sur