Der folgende Code kompiliert gut auf MSVC aber Chockes auf gcc/Xcode.Nur MSVC in der Lage, diesen Code zu kompilieren
In test1.h:
template<class T, class T2>
#ifdef WIN32
class __declspec(dllexport) Base
#else
class Base
#endif
{
protected:
struct Impl;
Impl *pimpl;
virtual int Baz(std::vector<T2> &errorMsg) = 0;
public:
virtual ~Base() = 0;
Impl &GetTableVector() { return *pimpl; };
virtual int Foo(T *param, std::vector<T2> &errorMsg) = 0;
virtual int Bar(std::vector<T2> &errorMsg) = 0;
};
template<class T, class T2> struct Base<T, T2>::Impl
{
std::vector<Table> m_tables;
};
template<class T, class T2> Base<T, T2>::~Base()
{
delete pimpl;
}
In test2.h:
template <class T, class T2>
#ifdef WIN32
class __declspec(dllexport) Derived : public Base<T, T2>
#else
class Derived : public Base<T, T2>
#endif
{
public:
Derived();
virtual ~Derived();
virtual int Foo(T *param, std::vector<T2> &errorMsg);
virtual int Bar(std::vector<T2> &errorMsg);
protected:
void GetErrorMessage(int code, T2 &errorMsg);
virtual int Baz(std::vector<T2> &errorMsg);
};
In test2.cpp:
template<class T, class T2> Derived<T, T2>::Derived() : Base<T, T2>()
{
pimpl = new Impl;
}
Die Fehlermeldung ist:
error: pimpl was not declared in this scope.
Nun, diese Variable ist in der Basisklasse als geschützt deklariert und sollte daher für die abgeleitete Klasse sichtbar sein.
Die komische Sache ist - dieser Code war in Ordnung, ohne Vorlagen zu verwenden.
Irgendeine Idee, wie ich es repariere?
Thx.
Ihr 'Derived'-Konstruktor delegiert sich an sich, vermutlich wollten Sie den' Base'-Konstruktor aufrufen. – user657267
Versuchen Sie 'this-> pimpl'. –
@ user657267, behoben. Nur ein Tippfehler, Entschuldigung. – Igor