Fill<T, Pack, Size, Value>
, Değer yinelenen Boyut süreleri olan Pack<Value, Value, ..., Value>
türünde olmalıdır. Birisi açıklayabilir, neden bu belirsizdir? Bu süreBirisi neden burada belirsizliği açıklıyor, lütfen?
template <typename T, template <T...> class Pack, int Size, int Count, typename Output, T Value>
struct FillHelper;
template <typename T, template <T...> class P, int Size, int Count, T... Output, T Value>
struct FillHelper<T, P, Size, Count, P<Output...>, Value> :
FillHelper<T, P, Size, Count + 1, P<Output..., Value>, Value> {};
template <typename T, template <T...> class P, int Size, T... Output, T Value>
struct FillHelper<T, P, Size, Size, P<Output...>, Value> {
using type = P<Output...>;
};
template <typename T, template <T...> class P, int Size, T Value>
using Fill = typename FillHelper<T, P, Size, 0, P<>, Value>::type;
template <int...> struct Pack;
int main() {
using T = Fill<int, Pack, 10, 4>;
}
değildir:
template <typename T, int Size, int Count, typename Output, T Value>
struct FillHelper;
template <typename T, template <T...> class P, int Size, int Count, T... Output, T Value>
struct FillHelper<T, Size, Count, P<Output...>, Value> :
FillHelper<T, Size, Count + 1, P<Output..., Value>, Value> {};
template <typename T, template <T...> class P, int Size, T... Output, T Value>
struct FillHelper<T, Size, Size, P<Output...>, Value> {
using type = P<Output...>;
};
template <typename T, template <T...> class P, int Size, T Value>
using Fill = typename FillHelper<T, Size, 0, P<>, Value>::type;
template <int...> struct Pack;
int main() {
using T = Fill<int, Pack, 10, 4>;
}
Ben dolaylı ikinci kısa ve ilkinden böylece iyi olduğunu fark ettim, ama ilki derlemek için bir neden şaşkın olduğu ortaya çıkıyor. Son zamanlarda GCC 4.9.2 ile hata alıyorum. Visual Studio 2013 ile de hata. Bu arada, ikinci koddan daha iyi bir çözüm karşılandı.
Güncelleme: sorunu daha azaltılması, bu GCC 4.9.2 (ve çok Visual Studio 2013) ile derlemek ETMEZ çünkü uzmanlık şablon-şablonun varlığı problemi değildir çıkıyor:
template <typename T, template <T...> class Pack, int Size, int Count>
struct F;
template <typename T, template <T...> class P, int Size, int Count>
struct F : F<T, P, Size, Count + 1> {};
template <typename T, template <T...> class P, int Size>
struct F<T, P, Size, Size> {
using type = int;
};
template <int...> struct Pack;
int main() {
using T = F<int, Pack, 10, 0>::type;
}
GCC ve VS ile kafa karışıklığına neden olan ilk koddaki sorun tam olarak nedir?
FWIW, hatasız ilki aşağı çınlama 3.6 Munches. Bilgi: Apple LLVM sürüm 6.1.0 (clang-602.0.49) (LLVM 3.6.0svn'ye göre). Belki de araç zinciri bilginizi ekleyin. – WhozCraig
Son zamanlarda GCC 4.9.2 ile hata alıyorum. Visual Studio 2013 ile de hata. – prestokeys
Evet, clang gerçekte bizden daha akıllı, çünkü aslında bunun dışında * kullanılan *. 'T'; '' 'ana()' nin eklenmesi bir doz verir: main.cpp: 23: 7: Tanımlanmamış şablonun örtük şekilde oluşturulması 'Pack <4, 4, 4, 4, 4, 4, 4, 4, 4 4> '. Her ne kadar olursa olsun, bilmek faydalı olabilir. ** düzenle ** nm. '{};' 'Pack' sonrası ekleyerek bir kez daha derler. – WhozCraig