只有MSVC能够编译此代码

时间:2016-03-30 04:06:01

标签: c++ templates gcc

以下代码在MSVC上编译正常但在gcc / Xcode上填充。

在test1.h中:

"www.google.com"

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

好吧,这个变量在基类中声明为protected,因此派生类应该是可见的。

奇怪的是 - 该代码在不使用模板的情况下编译得很好。

我知道如何解决它?

THX。

1 个答案:

答案 0 :(得分:1)

test2.cpp中使用此代码:

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

在Ubuntu 15.04上使用gcc 4.9.2我可以确认它已编译。