Ich weiß, dass die Frage nicht sehr beschreibend ist, aber ich könnte es nicht besser ausdrücken.Wie kann man die Warnung LNK4006 loswerden, wenn keine Vorlagen verwendet werden?
Ich versuche, eine statische verknüpfte Bibliothek zu kompilieren, die mehrere Objekte enthält, werden alle Objekte enthalten die folgenden:
#include foo.h
foo.h ist etwas in dieser Richtung:
#pragma once
template<class T>
class DataT{
private:
T m_v;
public:
DataT(T v) : m_v(v){}
};
typedef DataT<double> Data;
Jetzt , alles funktioniert gut, aber wenn ich DataT so ändere, dass es nur Data mit double statt T ist, erhalte ich eine LNK4006-Warnung bei der Verbindungszeit für jede .obj, die besagt, dass die .ctor bereits definiert wurde.
Edit 1:
#pragma once
class Data{
private:
double m_v;
public:
Data(double v) : m_v(v){}
};
Edit 2: ich MSVC7 bin mit. Die .ctor tatsächlich in beiden Fällen wie in
...
public:
Data(double v);
#include foo.inl
...
//foo.inl
Data::Data(double v): m_v(v) {}
enthalten ist, Was ich versuche aber, zu erreichen, ist nicht so zusammengestellt zu haben, aber als Header kann der Benutzer verwenden.
Können Sie zeigen, wie der geänderte Code aussieht? – gatorfax
Welchen genauen Compiler benutzen Sie? Ist der Code wirklich so, wie du ihn postest? (Ist der Konstruktor insbesondere im Klassenkörper definiert oder ist er außerhalb der Klassendefinition definiert? Dies ist besonders wichtig). Wie Mike kommentierte: Wenn Sie Probleme mit einem bestimmten Code haben, schreiben Sie den Code, der Ihnen Probleme bereitet, nicht irgendeinen anderen Code, der perfekt kompiliert. Meine Vermutung ist, dass Sie den Konstruktor innerhalb der .h aber außerhalb der Klasse definieren. –
Jetzt können Sie zeigen, wie der Header und die Data-Klasse verwendet werden? Der angezeigte Header funktioniert einwandfrei. Werden alle CPP-Dateien neu kompiliert? –