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 olaraktemplate <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.
'Türetilmiş 'yapıcınız kendi başına,' Base 'yapıcısını çağırmak anlamına gelir. – user657267
Bunu deneyin> pimpl'. –
@ user657267, sabit. Sadece yazım hatası, üzgünüm. – Igor