В этом коде:
// 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': функция не встроена