Неверное целочисленное константное выражение - PullRequest
0 голосов
/ 18 февраля 2011

В этом коде:

// CompileTimeWarnings.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <type_traits>
using namespace std;
#define __STR1__(x) #x

#define __LOC__ __FILE__ "("__STR1__(__LINE__)") : warning : "

// collisions.cpp

template<class T, class T1>
struct mismatch
{
    //enum {value = is_signed<T>::value && is_signed<T1>::value};
    static const bool value; //= is_signed<T>::value && is_signed<T1>::value;
};

template<class T, class T1>
bool mismatch<T,T1>::value = is_signed<T>::value && is_signed<T1>::value;

template<class T>
struct Int
{
};

template<class T, class T1>
int operator+(Int<T> t, Int<T1> t1)
{
#if int(mismatch<T,T1>::value)
#pragma message(__LOC__"Need to do 3D collision testing")
#endif
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
Int<int> a;
Int<signed> b;
b + a;
    return 0;
}

Я получаю следующее сообщение об ошибке:
C1017: Неверное целочисленное константное выражение.
Почему?И как ее решить?

Отредактировано

#include "stdafx.h"
#include <type_traits>
#include <iostream>

using namespace std;

template<class T>
struct Int
{
};

template<class T, class T1>
struct Mismatch
{
    static const bool value = (!is_signed<T>::value && is_signed<T1>::value) || 
                                (is_signed<T>::value && !is_signed<T1>::value);
};



template<bool b> struct Need_to_do_3D_collision_testing
{ 
    static void f()
    { static const char value=256; }
};

template<> struct Need_to_do_3D_collision_testing<true>
{
    static void f() { } 
};

template<class T, class T1> int operator+(Int<T> t, Int<T1> t1) 
{
Need_to_do_3D_collision_testing<!Mismatch<T,T1>::value>::f();
return 0;
} 






int _tmain(int argc, _TCHAR* argv[])
{
    Int<char> a;
    Int<unsigned char> b;
    b + a;
    return 0;
}

Я получаю следующие предупреждения:
Предупреждение 1 предупреждение C4305: «инициализация»: усечение из «int 'to' const char '
Предупреждение 2, предупреждение C4309: «инициализация»: усечение постоянного значения
, но не предупреждение с именем структуры.Поэтому он не работает для меня так, как должен.
Edit_2 Уровень предупреждения / стена - наивысший
Предупреждение 1 предупреждение C4820: '_wfinddata64i32_t': добавлено заполнение 4 байтами после элемента данных_wfinddata64i32_t :: attrib '
Предупреждение 2, предупреждение C4820:' _wfinddata64i32_t ': добавлено заполнение 4 байтами после элемента данных' _wfinddata64i32_t :: name '
Предупреждение 3, предупреждение C4820: добавлено _wfinddata64_t: добавлено 4 байтапосле члена данных '_wfinddata64_t :: attrib'
Предупреждение 4, предупреждение C4820: '_stat32': добавлено заполнение байтами '2' после элемента данных '_stat32 :: st_gid'
Предупреждение 5, предупреждение C4820: 'stat': '2'добавление байтов после элемента данных' stat :: st_gid '
Предупреждение 6 предупреждение C4820:' _stat32i64 ': добавление' 2 'байтов после элемента данных' _stat32i64 :: st_gid '
Предупреждение 7 предупреждение C4820:' _stat32i64': Добавлено 4 байта после элемента данных' _stat32i64 :: st_rdev 'Предупреждение 8, предупреждение C4820:' _stat32i64 ': добавлено 4 байта после элемента данных' _stat32i64 :: st_ctime '
Warning 9 warning C4820: '_stat64i32': добавлено заполнение байтами '2' после элемента данных '_stat64i32 :: st_gid'
Предупреждение 10 предупреждение C4820: добавлено заполнение байтов '_stat64': '2' после элемента данных '_stat64 :: st_gid'
Предупреждение 11, предупреждение C4820: '_stat64': добавлено заполнение '4' после элемента данных '_stat64 :: st_rdev' Предупреждение 12, предупреждение C4986: 'оператор new []': спецификация исключений не соответствует предыдущему объявлению
Предупреждение 13предупреждение C4986: «оператор delete []»: спецификация исключения не соответствует предыдущему объявлению
предупреждение 14 предупреждение C4820: «type_info»: добавлено заполнение байтов «3» после элемента данных «type_info :: _ M_d_name» предупреждение 15 предупреждение C4305: «инициализация ': усечение от' int 'до' const char 'Предупреждение 16 предупреждение C4309: «инициализация»: усечение постоянного значения
Предупреждение 17 предупреждение C4710: «std :: _ Exception_ptr std :: _ Exception_ptr :: _ Current_exception (void)': функция не встроена
Предупреждение 18 предупреждение C4710: 'std :: string std :: locale :: name (void) const': функция не включена
Предупреждение 19 предупреждение C4710: 'std :: locale std :: ios_base :: getloc (void) const': функция не встроена
Предупреждение 20 предупреждение C4710: 'std :: string std :: numpunct <_Elem>:: do_grouping (void) const ': функция не встроена
Предупреждение 21 предупреждение C4710:' std :: basic_string <_Elem, _Traits, _Ax> std :: numpunct <_Elem> :: do_falsename (void) const ': функция не встроена
Предупреждение 22, предупреждение C4710: 'std :: basic_string <_Elem, _Traits, _Ax> std :: numpunct <_Elem> :: do_truename (void) const': функция не встроена
Предупреждение 23, предупреждение C4710: 'std:: string std :: numpunct <_Elem> :: do_grouping (void) const ': функция не встроена
Предупреждение 24 предупреждение C4710:' std :: basic_string <_Elem, _Traits, _Ax> std :: numpunct <_Elem> ::do_falsename (void) const ': функция не встроена
Предупреждение 25 предупреждение C4710:' std :: basic_string <_Elem, _Traits, _Ax> std :: numpunct <_Elem> :: do_truename (void) const ': функция не встроена
Предупреждение 26 Предупреждение C4710: 'std :: basic_string <_Elem, _Traits, _Ax> std :: numpunct <_Elem> :: falsename (void) const ': функция не встроена
Предупреждение 27 предупреждение C4710:' std :: basic_string <_Elem, _Traits, _Ax> std :: numpunct <_Elem> :: truename (void) const ': функция не встроена
Предупреждение 28, предупреждение C4710: 'std :: basic_string <_Elem, _Traits, _Ax> std :: numpunct <_Elem> :: falsename (void) const': функция не встроена
Предупреждение 29 предупреждение C4710: 'std :: basic_string <_Elem, _Traits, _Ax> std :: numpunct <_Elem> :: truename (void) const ': функция не встроена
Предупреждение 30, предупреждение C4710: 'std :: string std :: numpunct <_Elem> :: grouping (void) const': функция не встроена
Предупреждение 31 предупреждение C4710: 'std :: string std :: numpunct <_Elem> :: grouping (void) const': функция не встроена

Ответы [ 2 ]

6 голосов
/ 18 февраля 2011
#if int(mismatch<T,T1>::value) 

Директивы предварительной обработки оцениваются до синтаксического анализа источника. В этой директиве #if компилятор понятия не имеет, что такое mismatch<T,T1>::value.

0 голосов
/ 18 февраля 2011
template<class T, class T1>
struct mismatch
{
    static const bool value; //= is_signed<T>::value && is_signed<T1>::value;
};

Помимо того, что сказал Джеймс, почему вы прокомментировали is_signed<T>::value ..? Раскомментируйте это. Это должно работать!


Решение (C ++ 03):

template<bool b> struct static_assert;
template<> struct static_assert<true>{};

template<class T, class T1>
int operator+(Int<T> t, Int<T1> t1)
{
    static_assert<!mismatch<T,T1>::value> Need_to_do_3D_collision_testing;
    return 0;
}

Если T и T1 не совпадают, вы увидите строку Need_to_do_3D_collision_testing в ошибке компиляции!


Решение (C ++ 0x):

template<class T, class T1>
int operator+(Int<T> t, Int<T1> t1)
{
    static_assert(!mismatch<T,T1>::value, "Need to do 3D collision testing");
    return 0;
}

Решение, которое выдает предупреждение вместо ошибки:

template<bool b> struct Need_to_do_3D_collision_testing 
{ 
     static void f() { static const char value=256; }
};
template<> struct Need_to_do_3D_collision_testing<true>
{
     static void f() { }
};

template<class T, class T1>
int operator+(Int<T> t, Int<T1> t1)
{
    Need_to_do_3D_collision_testing<!mismatch<T,T1>::value>::f();
    return 0;
}

Теперь, если T и T1 не совпадают, вы увидите строку Need_to_do_3D_collision_testing в компиляции warning !

Подобные методы используются для печати факториала во время компиляции здесь:

Расчет и печать факториала во время компиляции в C ++

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