enable_if для функции шаблона элемента шаблона класса - PullRequest
3 голосов
/ 16 декабря 2011

Это похоже на ошибку в MSVC10?

#include <type_traits>

template<int j>
struct A{
    template<int i>
    typename std::enable_if<i==j>::type
        t(){}
};

int main(){
    A<1>().t<1>();  //error C2770
}

ошибка C2770: недопустимые явные аргументы template_or_generic "enable_if :: type A :: t (void)".

Следующие компиляции:

#include <type_traits>

template<class j>
struct A{
    template<class i>
    typename std::enable_if<std::is_same<i,j>::value>::type
        t(){}
};

template<unsigned int j>
struct B{
    template<unsigned int i>
    typename std::enable_if<i==j>::type
        t(){}
};

int main(){
    A<int>().t<int>();
    B<1>().t<1>();
}

1 Ответ

1 голос
/ 20 ноября 2012

Это кажется странным поведением со стороны 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 ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...