2016-03-30 4 views
0

次のコードはMSVCではうまくコンパイルされますが、gcc/Xcodeではchockesがコンパイルされます。 test1.hでこのコードをコンパイルできるのはMSVCだけ

:test2.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; 
} 

:test2.cppで

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

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

エラーメッセージがある:

error: pimpl was not declared in this scope. 

この変数は、基本クラスでprotectedと宣言されているため、派生クラスから参照できるようにする必要があります。

奇妙なことは、そのコードはテンプレートを使用せずにうまくコンパイルしていたことです。

どうすればいいですか?

Thx。

+0

あなたの 'Derived'コンストラクタは、おそらく' Base'コンストラクタを呼び出すことを意図して、それ自身に委譲します。 – user657267

+1

'this-> pimpl'を試してください。 –

+0

@ user657267、修正されました。ちょうどタイプミス、申し訳ありません。 – Igor

答えて

1

この代わりにtest2.cpp使用の際には:Ubuntuの15.04で

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と私はそれがコンパイルされることを確認することができます。

+0

このコードはifdefされますか? – Igor

+0

それを試してみてください。両方のコンパイラで動作します。 Xcodeで動作します。 – Igor

関連する問題