2016-03-30 6 views
0

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.

+0

Ihr 'Derived'-Konstruktor delegiert sich an sich, vermutlich wollten Sie den' Base'-Konstruktor aufrufen. – user657267

+1

Versuchen Sie 'this-> pimpl'. –

+0

@ user657267, behoben. Nur ein Tippfehler, Entschuldigung. – Igor

Antwort

1

In test2.cpp Verwendung dieses stattdessen:

template<class T, class T2> Derived<T, T2>::Derived() : Base<T, T2>() 
{ 
    Base<T, T2>::pimpl = new typename Base<T, T2>::Impl; 
} 

auf Ubuntu 15.04 mit 4.9.2 gcc kann ich bestätigen, dass es kompiliert.

+0

Sollte dieser Code idefdef sein? – Igor

+0

Versuchte es. Funktioniert auf beiden Compilern. Und funktioniert auf Xcode. – Igor

Verwandte Themen