Ich arbeite mit Vorlagen in C++. Gibt es einen Unterschied in der Verwendung von Templates und der Friend-Klasse, wenn sie mit dem MSVC-Compiler kompiliert werden und wenn der Mingw-gcc-Compiler verwendet wird. Mein Code kompiliert erfolgreich und gibt die gewünschte Ausgabe, wenn mit MSVC kompiliert wird, aber es gibt Fehler, wenn mit Gcc kompiliert wird. Unten ist mein Code,C++ Template-Klasse verhält sich für verschiedene Compiler unterschiedlich
///////////Record.h/////////////////////
#include "Base.h"
class Derived1;
class Derived2;
template <class TYPE_LIST> class List;
class FRecord
{
public:
FRecord();
virtual ~FRecord();
friend class Base;
#if _MSC_VER <= 1200
friend class List<Derived1>;
friend class List<Derived2>;
#else
template <class TYPE_LIST> friend class List;
#endif
};
///////////////////////////////////////////////////////////////
///////////////////Base.h/////////////////////////////////
class Base
{
public:
Base(const HEADER *hc, const FRecord *fr);
virtual ~Base();
__inline bool IsNonValid() const;
protected:
quint32 Size;
};
/////////////////////////////////////
// Data
/////////////////////////////////////
template <class TYPE_LIST>
class Data : public TYPE_LIST
{
public:
Data(const HEADER *hc, const FRecord *fr) : TYPE_LIST(hc, fr)
{
QString val = IsNonValid() ? "Non" : "";
LOG0("Data ("<< val << " Valid)");
}
virtual ~Data()
{
LOG0("Data deleted");
}
}; // Data
///////////////////////////////////////////////////////////////////////////////////////
Wenn der obige Code mit MSVC kompilierte Ausgabe gewünscht ergibt aber, wenn sie mit Mingw GCC-Compiler kompiliert gibt sie Fehler folgende,
Base.h:1154: error: there are no arguments to 'IsNonValid' that depend on a template parameter, so a declaration of 'IsNonValid' must be available
Base.h:1553: error: 'Size' was not declared in this scope
Was die mögliche Lösung für dieses Problem sein könnte ? Vielen Dank im Voraus.
Dank @Angew: Ihre Lösung löste mein Problem.:)..Jetzt wie kann ich den Status meiner Frage zu Gelöst geändert? – user2765235
@ user2765235 Durch die Annahme der Antwort, die Sie für die Lösung des Problems halten. Klicken Sie dazu auf das grüne Häkchen neben der Antwort. Weitere Informationen finden Sie in der [Hilfe] (http://stackoverflow.com/help/accepted-answer). – Angew