Явная специализация функций шаблона члена C ++ struct - это проблема Visual Studio? - PullRequest
4 голосов
/ 21 мая 2011

У меня проблема со специализацией шаблона, которая сводится к следующему фрагменту:

#include <iostream>

struct Class
{
    template <unsigned int N> static void fun(double a[N], double (&x)[N+1]);
};

template <> inline void Class::fun<1u>(double a[1u], double (&x)[2u])
{
    x[0] += 0.2;
}

template <> inline void Class::fun<2u>(double a[2], double (&x)[3])
{
    x[0] += 0.4;
}

int main(void)
{
    double x[1] = {0};
    double a[2] = {0, 1};
    double b[3] = {0, 0, 1};

    Class::fun<1>(x, a);
    Class::fun<2>(a, b);
    std::cout << a[0] << " " << b[0] << std::endl;
    return 0;
}

Он компилируется и работает правильно, отображая 0.2 0.4 в Cygwin g ++ 4.3.4, а также компилируется в Comeau Online компилятор . Однако Visual Studio C ++ 2010 Express выдает следующее сообщение об ошибке:

error C2910: 'Class::fun' : cannot be explicitly specialized
error C2910: 'Class::fun' : cannot be explicitly specialized

РЕДАКТИРОВАТЬ: когда я изменил функцию на свободную функцию, сообщение об ошибке изменилось на

error C2912: explicit specialization; 'void fun<1>(double [],double (&)[2])' is not a specialization of a function template

Итак, два вопроса: 1. мой код допустим C ++ 2. если это так, это известная проблема с компилятором Visual Studio C ++ 2010?

1 Ответ

4 голосов
/ 24 мая 2011

Ну, я бы сказал, что, скорее всего, это допустимый код на С ++, так как я компилирую и запускаю его нормально:

g++ -ansi -gstabs+ -Wall -o fun fun.cpp
g++ -std=c++98 -gstabs+ -Wall -o fun fun.cpp
g++ -std=c++0x -gstabs+ -Wall -o fun fun.cpp

Я подозреваю, что это та же самая ошибка, упомянутая здесь: http://msdn.microsoft.com/en-us/library/cx7k7hcf(v=vs.80).aspx

В частности:

Явная специализация функции-члена вне класса недопустима, если функция уже была явно специализирована через специализацию класса шаблона. (C2910). * * +1010

из http://msdn.microsoft.com/en-us/library/h62s5036(v=vs.80).aspx

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