2016-03-30 25 views
0

Aşağıdaki kod, MSVC'de sıkıdır, ancak gcc/Xcode üzerinde çalışır. test1.h olarakSadece MSVC bu kodu derleyebildi

:

test2.cpp olarak
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); 
}; 

: hata mesajı

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

olan

:

error: pimpl was not declared in this scope. 
test2.h olarak

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; 
} 

Bu değişken korunan temel sınıfta bildirilmiş ve türetilmiş sınıf için görünür olmalıdır.

Tuhaf olan şey - bu kod şablonlar kullanılmadan düzgün bir şekilde derleniyordu.

Herhangi bir fikri nasıl düzeltebilirim?

Thx.

+0

'Türetilmiş 'yapıcınız kendi başına,' Base 'yapıcısını çağırmak anlamına gelir. – user657267

+1

Bunu deneyin> pimpl'. –

+0

@ user657267, sabit. Sadece yazım hatası, üzgünüm. – Igor

cevap

1

yerine bu test2.cpp Kullanımda: Ubuntu 15.04 Açık

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

gcc 4.9.2 ile bunu derler onaylayabilir.

+0

Bu kod ifdef'ed mi? – Igor

+0

Denedim. Her iki derleyicide de çalışır. Ve Xcode üzerinde çalışıyor. – Igor