Это проблема с анализом / созданием шаблонов в VS2010? - PullRequest
4 голосов
/ 02 апреля 2011

Пожалуйста, не обращайте внимания на длину этого кода (просто скопируйте и вставьте). Когда вы это сделаете, запустите его, и он не будет компилироваться под VS2010. Чтобы скомпилировать этот код, в структуре Range удалите «class IntType» из параметров шаблона и в main вместо:

Range<int,float> r;

Марка

Range<float> r; //int is removed 

Код:

template<class T>
struct Assign_Low_High
{
    static const int low_value = 0;
};


//in order to compile remove class IntType, from template params of Range struct
template<class IntType, class L>
struct Range
{
    static_assert(Assign_Low_High<L>::low_value < 1,
                    "Incorrect Range");
};


int main()
{
    //in order to compile remove int from Range
    Range<int,float> r;
    return 0;
}

Что на земле происходит? (он компилируется с GCC 4.5.1).

Ответы [ 2 ]

4 голосов
/ 02 апреля 2011

Похоже, что оператор <сбрасывает компилятор с неверной дорожки.Если вы: </p>

static_assert( Assign_Low_High<L>::low_value > -1, "Incorrect Range");

или

static_assert( (Assign_Low_High<L>::low_value) < 1, "Incorrect Range");

, это будет работать.

Если вы сделаете:

static_assert( Assign_Low_High<L>::low_value < 1 > 0, "Incorrect Range");

, тогда это будет интересно...

Я думаю, что компилятор должен рассматривать имя, зависящее от low_value, как имя, не зависящее от типа и не зависящее от шаблона, и считать, что "<", следующее за low_value, является оператором меньше чем.Поэтому я бы сказал, что компилятор gcc делает правильные вещи, в то время как компилятор MS 2010 этого не делает, но, к счастью, с его помощью можно добиться желаемого эффекта. </p>

Еще одна вещь, это, очевидно, не связано с static_assert, поскольку:

 bool bComp = Assign_Low_High<int>::low_value < 1;

непосредственно в main приводит к тем же ошибкам компиляции ...

0 голосов
/ 02 апреля 2011

Я не могу скомпилировать это прямо сейчас, но похоже, что ваш static_assert не работает.Вы утверждаете, что низкое значение меньше 0, когда оно фактически равно 0.

Если это не проблема, не могли бы вы опубликовать сообщение об ошибке компилятора? Перемещение статического утверждения в конструктор Range компилируется должным образом и все еще выполняет задачу подтверждения всякий раз, когда вы используете шаблон.Исходя из этого и того факта, что предложение в assert компилируется, когда не в assert, я бы предположил, что реализация MS static_assert немного ошибочна.

...