2016-04-01 34 views
-1

Bazı operatörlerin belirli türler için tanımlanmış olup olmadığını kontrol eden birkaç şablonum var ve ben de ifade döndürme türünü kontrol ediyorum. Bu şablonu belirli türlerle başlattığımda, her şey tamam, ancak bazı türlerde MSVC'de derleyici hatası alıyorum. GCC'de "şablon argümanı geçersiz" hatası alıyorum. Bu kod ile yanlış bir şeyC++ iç içe şablon hatası

template <typename _Type, typename _ReturnType> 
static auto test(_Type&& var, _ReturnType&&) 
-> decltype(std::enable_if_t<std::is_same<_ReturnType, decltype((var) OPERATOR)>>(), std::true_type()); 

var mı: Ben artırma sonrası kontrolünü örneğini zaman İşte sorun neden hattıdır?

Not: OPERATOR kontrol etmek istediğim operatöre makro genişletilmiş. Tüm şablon, kod tekrarından kaçınmak için kullandığım daha büyük makronun bir parçasıdır.

+0

Lütfen bir [Minimal, Tam ve Doğrulanabilir örnek] (http://stackoverflow.com/help/mcve) gönderin. –

cevap

0

Sorun şu ki, std::enable_if_t'un bool olmasını bekliyor, ancak bir tane std::is_same'dan tedarik etmiyorsunuz. std::is_same sonucunu elde etmek için value değişkenine (kontrolün sonucu olan) erişmeniz gerekir.

template <typename _Type, typename _ReturnType> 
static auto test(_Type&& var, _ReturnType&&) 
-> decltype(std::enable_if_t<std::is_same<_ReturnType, decltype((var) OPERATOR)>::value>(), std::true_type()); 
+0

'' value' değerini döndürmek için 'operator()' karakterini tanımlayan özellikler yazmayın. – Rerito

+0

@Rerito yaparlar, ancak sadece C++ 14'den beri – Rakete1111