'daki kareler, varyant şablonları ve CRTP İşte senaryo: Değişken sayıda karma karışıma sahip olabilecek bir ana bilgisayar sınıfına sahip olmak istiyorum (değişken şablonlarla çok zor değil - bkz. Örneğin, http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.103.144). Bununla birlikte, karıĢımların ana sınıf tarafından parametrelenmesini de istiyorum, böylece genel türlerine (CRTP deyimini kullanarak) başvurabilirler. Sorun, ikisini karıştırmaya çalışırken ortaya çıkar - doğru sözdizimi bana net değil. hata ileC++
template <template<class> class... Mixins>
class Host : public Mixins<Host<Mixins>>... {
public:
template <class... Args>
Host(Args&&... args) : Mixins<Host>(std::forward<Args>(args))... {}
};
template <class Host> struct Mix1 {};
template <class Host> struct Mix2 {};
typedef Host<Mix1, Mix2> TopHost;
TopHost *th = new TopHost(Mix1<TopHost>(), Mix2<TopHost>());
:
tst.cpp: In constructor ‘Host<Mixins>::Host(Args&& ...) [with Args = Mix1<Host<Mix1, Mix2> >, Mix2<Host<Mix1, Mix2> >, Mixins = Mix1, Mix2]’:
tst.cpp:33: instantiated from here
tst.cpp:18: error: type ‘Mix1<Host<Mix1, Mix2> >’ is not a direct base of ‘Host<Mix1, Mix2>’
tst.cpp:18: error: type ‘Mix2<Host<Mix1, Mix2> >’ is not a direct base of ‘Host<Mix1, Mix2>’
herkes başarılı deneyimi cRTP ile variadic şablonlar karıştırma var mı Örneğin , aşağıdaki kod g ++ 4.4.1 ile derlenmeyecektir?
Temditli kurucu içerecek şekilde değiştirdim. template Sunucu (Args && ... args): Katmalar ... Sumant {} –
Sumant
Teşekkür (STD) öne> (args ::). Öneriniz mantıklı, ama benim için bir şekilde işe yaramaz. Hangi derleyici sürümünü kullanıyorsunuz? Bu kodu kopyaladım ve yapıştırdım ve derleme yaparken: tst2.cpp: 'int main()' işlevinde:: tst2.cpp: 16: hata: 'Ana makine numaralı aramaya eşleşen işlev yok: : Ana bilgisayar (Mix1 >, Mix2 >) ' tst2.cpp: 7: not: adaylar şunlardır: Ana makine :: Ana bilgisayar (Mixins > && ...) [Mixins = Mix1, Mix2] tst2.cpp: 5: not: Host :: Ana Bilgisayar (const Ana Makine &) –
Eitan
Oh, düzeltmenizi kaçırdım. Bu, "eşleşen işlev yok" hatasını düzeltir, ancak "derleyici hatası" ile patlar. :) Bu yüzden hangi derleyiciyi kullanıyorsunuz? – Eitan