Je sais que la question n'est pas très descriptive mais je ne pourrais pas la formuler mieux.Comment se débarrasser de l'avertissement LNK4006 lorsque vous n'utilisez pas de modèles?
Je suis en train de compiler une bibliothèque liée statique qui a plusieurs objets, tous les objets contiennent les éléments suivants:
#include foo.h
foo.h est quelque chose le long de ces lignes:
#pragma once
template<class T>
class DataT{
private:
T m_v;
public:
DataT(T v) : m_v(v){}
};
typedef DataT<double> Data;
maintenant , tout fonctionne bien, mais si je change DataT pour être simplement Data avec double au lieu de T, j'obtiendrai un avertissement LNK4006 au moment de la liaison pour chaque .obj indiquant que le .ctor était déjà défini.
Edit 1:
#pragma once
class Data{
private:
double m_v;
public:
Data(double v) : m_v(v){}
};
Edit 2: J'utilise MSVC7. Le .ctor est en fait inclus dans les deux cas comme dans
...
public:
Data(double v);
#include foo.inl
...
//foo.inl
Data::Data(double v): m_v(v) {}
Ce que je suis en train d'accomplir bien, est de ne pas avoir ce compilable mais comme en-tête, l'utilisateur peut utiliser.
Pouvez-vous montrer à quoi ressemble le code modifié? – gatorfax
Quel compilateur exact utilisez-vous? Le code est-il vraiment tel que vous le publiez? (En particulier, est-ce que le constructeur est défini dans le corps de la classe? Ou est-il défini à l'extérieur de la définition de la classe? Ceci est particulièrement important). Comme Mike a commenté: Si vous avez des problèmes avec un code particulier, postez le code qui vous donne des problèmes pas un autre code qui compile parfaitement. Ma conjecture est que vous définissez le constructeur à l'intérieur du .h mais en dehors de la classe. –
Maintenant, pouvez-vous montrer comment l'en-tête et la classe Data sont utilisés? L'en-tête affiché fonctionne correctement. Tous les fichiers .cpp sont-ils recompilés? –