Ben std::enable_if
kullanarak çalışıyor şu durumda: Artıkyinelenmesi şikayetçi?
template<typename T,
typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }
template<typename T,
typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }
, ben cppreference içinde daha temiz Bence yeni sözdizimi, testere:
: Ben port için kodumu istediğinitypename = std::enable_if_t<std::is_same<int, T>::value>>
template<typename T,
typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }
template<typename T,
typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
Ama şimdi GCC (5.2) şikayet:
error: redefinition of 'template<class T, class> void g()'
void g() { }
Neden böyle? Bu durumda yeni, daha özlü sözdizimine sahip olmak için ne yapabilirim? Bir ":: type" kaçırıyorsun
İkinci kodunuz varsayılan şablon argümanlarını kullanır. Bunlar, işlev imzasının bir parçası değildir, dolayısıyla aynı imza = redefinition ile iki işlev şablonu bildiriyorsunuz. 'Enable_if_t' nin karşılık gelen kullanımı 'std :: enable_if_t :: value> * = nullptr' dir. –
dyp
Orijinal kodunuzu tam olarak yeniden yazmadınız. '* Nullptr'ı unuttun. –
Bildirimlerden birine "kımıldama şablon parametresi ekleyebilirsiniz", örneğin, "enable_if" –