2016-03-22 21 views
0

Boost MPL (ve genel olarak meta programlama) konusunda oldukça yeniyim ve bence şablonlar ve tipler fikriyle kafam karıştı. Çalıştığım basit bir örnek, bir vektörün uzunluğunu hesaplamaya çalışıyor. Aşağıdaki ince derler:Boost MPL Türleri Vs Şablonları

sonra
struct TestSize 
{ 
    template <typename mySequence> struct apply 
    { 
     typedef mpl::size<mySequence>::type type; 
    }; 
}; 

typedef TestSize::apply<myVector>::type result; 

alıyorum hata "hata: metalik konstrüksiyonları" boost

typedef mpl::vector_c< int, 0, 1, 2, 3, 4, 5, 6, 7 > myVector; 

struct TestSize 
{ 
    template <typename mySequence> struct apply 
    { 
     typedef mpl::size<mySequence> type; 
    }; 
}; 

typedef TestSize::apply<myVector>::type result; 

ama böyle, boyut hesaplama sonucuna ":: type" eklerseniz :: mpl :: size :: type [ile Sekans = mySequence] "bir tür ismi değil".

Bu, iç içe geçmiş bir ad alanında olduğu için şablon parametresinin çıkarılmadığı bir durum mu? Aslında benim karışıklığa olduğunu eklemek, o aşağıdaki derler:

struct TestSize 
{ 
    template <typename mySequence> struct apply 
    { 
     typedef mpl::size<mySequence> type; 
     typedef mpl::range_c<int, 0, type::type::value> myRange; 
    }; 
}; 

typedef TestSize::apply<myVector>::type result; 
typedef TestSize::apply<textureIndices>::myRange range; 

Neden yapabilirim "tip :: tip :: değerini" Orada, ama daha önce on line değil "boyutu < mySequence> :: türü"? Eğer (iç apply olarak) böyle typename kullanmak gerekir, çünkü

cevap

3

Bu hatayı yaşıyorsanız nedeni:

struct TestSize 
{ 
    template <typename mySequence> struct apply 
    { 
     typedef typename mpl::size<mySequence>::type type; // <-- here! 
    }; 
}; 

bu bağlamda typename ihtiyacı derleyiciler şablonları derlemek şekilde doğar. Şablon başlangıçta önceden derlendiğinde, yarı doğru olması gerekir. Ancak, derleyici (bu noktada) mpl::size<mySequence>::type'un gerçekten bir tür olduğunu bilmez. Bu noktada, mySequence'un ne olduğunu ve mySequence için nasıl mpl::size belirtildiğini bilmiyor. Ve varsayılan olarak olduğunu varsayan bir türü değil. Yani bunu ima etmelisin.

Ve şimdi muhtemelen neden type::type::value'un iyi çalıştığını anlıyorsunuz - derleyici varsayılan olarak value'un tür olmadığını düşünüyor, bir tür olarak kullanmayı denemiyorsunuz ve derleyici mutlu. Bu arada, value'u belirli bir uzmanlık için bir tür olarak tanımlayacak olsaydınız, bu uzmanlık kullanıldığında komik bir derleme hatası yaşayacaksınız!

+1

@ user1777820, sadece böyle bir Pandora kutusu açtı! Kısacası, nedeni şu ki, mpl :: size :: type' * şablona bağlı bir * addır. 'T' nin sematici, T 'nin aslında ne olduğuna bağlı olarak farklı olurdu - bir fonksiyon, bir tür, bir değişken olabilir… Her şey. Diğer taraftan, "" boyutunun sematikleri "T" ye bağlı değildir - ne olursa olsun "T", boyut 'sadece bir şeydir - daha önce tanımlanmış şablon sınıfının 'boyut' şablon örneği. Hiçbir belirsizlik, bu yüzden ipucu gerek yok. – SergeyA

+0

Yeni bir soruya başlayacağım için yorumumu sildim, bu yüzden gelecekte bunu okuyan herkes için ekliyorum. Buradaki çözümün, typename ipucunu kullanarak, ilk kod örneğimden "typedef mpl :: size type;" satırıyla nasıl farklılaştığını soruyordum. hangi iyi derler. Teşekkürler @SergeyA! – user1777820

İlgili konular