Это кажется странным поведением со стороны MSVC2010, когда он не может определить, является ли использование вами <1> в качестве параметра шаблона экземпляром шаблона на основе int.
Когда я компилирую ваш код выше, я получаю следующее, подробное сообщение об ошибке:
error C2770: invalid explicit template argument(s) for
'std::enable_if<i==1>::type A<j>::t(void)'
with
[
j=1
]
d:\programming\stackoverflow\stackoverflow\stackoverflow.cpp(11) :
see declaration of 'A<j>::t'
with
[
j=1
]
Если вы поменяете свои 1 значения на 0, вы обнаружите, что это все еще не работает, но если вы используете любойВ другом действительном int шаблон, кажется, компилируется довольно счастливо.
Я не совсем уверен, почему это происходит, но вы можете заставить этот код работать, используя константы для представления параметров шаблона:
template<int j>
struct A{
template<int i>
typename std::enable_if<i == j>::type
t(){}
};
int main(){
const int j = 1;
const int i = 1;
A<j>().t<i>(); //now compiles fine
}
Мое подозрение, основанное на этом, состоит в том, что компилятор находит использование 0 и 1 неоднозначным, когда дело доходит до создания шаблона.Надеюсь, что обходной путь полезен для тех, кто наткнулся на это через Google ...