2010-03-30 7 views
3

Lors de la tentative d'intégration d'une fonction dans Visual C++ (2008 express), j'ai reçu une erreur de liaison, après une inspection étroite du code, ce que j'ai découvert essayer de mettre en ligne jette une exception ... si je supprime le jet d'exception, l'erreur de liaison disparaît, quelqu'un peut-il expliquer pourquoi c'est le cas?erreur de liaison dans Visual C++ lors de la tentative de fonctions inline

int com_ximpleware::FastIntBuffer::intAt(int index){ 
    if (index < 0 || index > size - 1) { 
     throw InvalidArgumentException("invalid index range in FastIntBuffer's intAt()"); 
    } 
    return ((int *) al->get(index>>exp))[index & r]; 
} 

L'erreur de EXAxt est indiqué ci-dessous:

intHash.obj : error LNK2019: unresolved external symbol "public: int __thiscall com_ximpleware::FastIntBuffer::intAt(int)" ([email protected]@[email protected]@[email protected]) referenced in function [email protected]@[email protected]@[email protected]$0 
1>C:\new_cvs\cpp_test1\Debug\cpp_test1.exe : fatal error LNK1120: 1 unresolved externals 

une chose, cette fonction a été invoquée autre normalement, la partie appelant de la fonction n'a pas été inclus.

+0

L'avez-vous déplacé dans un fichier d'en-tête lorsque vous l'avez inséré? –

+0

Je mets la définition (c'est-à-dire l'implémentation) dans l'entête et il n'y a pas de problème ... dois-je la déplacer dans l'en-tête pour l'incruster? Je pensais pouvoir le déclarer comme une fonction intégrée, non? –

+0

il doit être visible partout où il est appelé, donc généralement il doit être dans le fichier d'en-tête. – Darryl

Répondre

9

Vous devrez placer votre définition dans le fichier d'en-tête.

Une fonction membre inline peut être défini de deux façons:

  • définir la fonction de membre dans le corps de la classe elle-même.
  • Déclarez la fonction membre comme une fonction membre normale dans la classe, mais lorsque vous définissez la fonction de membre en ligne, PREPEND la définition de la fonction de membre avec le mot-clé inline et mettre la définition dans un fichier d'en-tête, comme ce qui suit:

class ClassA 
{ 
public: 
    void f(); 
}; 

inline void ClassA::f() 
{ 
} 

Si vous mettez la définition de la fonction en ligne dans un fichier .cpp et si elle est appelée à partir d'un autre fichier .cpp, vous obtiendrez une erreur « externe non résolu » (C++ FAQ Lite) de l'éditeur de liens.

Je ne pense pas que cela ait quelque chose à voir avec l'exception étant levée. Je pourrais répliquer ce problème dans Visual C++ 2005 même si l'exception n'est pas levée. Je suppose qu'il tentait d'intégrer la fonction mais qu'il ne trouvait pas sa définition, car elle se trouvait dans un fichier .cpp distinct. Le compilateur a probablement effectué un traitement spécial car il a reconnu le mot-clé inline dans la définition. Si vous supprimez le mot clé inline, le problème disparaît et la liaison est réussie. Par conséquent, vous devez placer la définition avec sa déclaration dans le fichier d'en-tête, si vous voulez qu'elle soit traitée en ligne.

Questions connexes