以下代码在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。
答案 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我可以确认它已编译。