Dış sınıfın şablon parametreleri olduğunda iç içe geçmiş bir sınıf için satır içi kurucu sağlamaya çalışırken zamanın bir anını yaşıyorum. Büküm, iç sınıf sadece veri üye beyanları ile farklıdır. Aşağıda benim MCVE. Daha az olabilseydi özür dilerim. Yukarıdan Dış sınıf tempold edildiğinde iç içe geçmiş sınıf için satır içi kurucu
typedef unsigned char byte;
template<class W, bool B>
struct F
{
struct G;
};
template class F<int, false>;
template class F<long, true>;
template<>
struct F<int, false>::G
{
G();
byte b[4];
};
template<>
struct F<long, true>::G
{
G();
byte b[6];
};
template<>
F<int, false>::G::G()
{
b[0] = b[1] = b[2] = b[3] = 0;
}
template<>
F<long, true>::G::G()
{
b[0] = b[1] = b[2] = b[3] = b[4] = b[5] = 0;
}
int main(int argc, char* argv[])
{
return 0;
}
, ben sadece çizgi dışına olmak
F::G::G
istiyorum.
bunu derlemek girişiminde, bu sonuçlanır:
test.cxx:29:1: error: template-id ‘G<>’ for ‘F<int, false>::G::G()’ does not match any template declaration
F<int, false>::G::G()
^
test.cxx:35:1: error: template-id ‘G<>’ for ‘F<long int, true>::G::G()’ does not match any template declaration
F<long, true>::G::G()
^
nasıl G
için bir out-of-line yapıcısı sağlar?
İşlevlere odaklanan başka benzer sorular var. Bağlantı kopukluğum, veri üyesi ağrıyan nokta olduğunda bunu çalışıyor gibi görünüyor. How to explicitly instantiate a template class that has a nested class with a friend function
- Template method of template class specialization
- Specialization of template method in partial class specialization
- ve diğ.
İşte yapmak çalışıyorum budur. C++ bu kadar kolay olmasına izin vermez, bu yüzden derleme zamanı bildirimlerini almak için şablon uzmanlıklarına başvurmak zorunda kaldım.
template<class W, bool B>
struct F
{
struct G
{
#if (B == true)
byte b[6];
#else
byte b[4];
#endif
};
};
'G' kurucuları [benim için çalışır] (http://ideone.com/u65mFa). –