This code below compiles fine with VS2010 but doesn’t want to compile with gcc 4.6.1.:
#ifndef IS_CHAR_H_INCLUDED
#define IS_CHAR_H_INCLUDED
#include <type_traits>
template<class Int_T>
struct Is_Char_
{
enum {value = false};
};
template<>
struct Is_Char_<char>
{
enum {value = true};
};
template<>
struct Is_Char_<unsigned char>
{
enum {value = true};
};
template<>
struct Is_Char_<signed char>
{
enum {value = true};
};
template<class Int_T>
struct Is_Char : Is_Char_<typename std::remove_cv<Int_T>::type>
{
};
#endif // IS_CHAR_H_INCLUDED
#ifndef PROMOTE_H_INCLUDED
#define PROMOTE_H_INCLUDED
#include <type_traits>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/find.hpp>
#include <boost/mpl/next.hpp>
#include <boost/mpl/deref.hpp>
#include <boost/mpl/end.hpp>
//#include "Is_Char.h" doesn't have to be here this file is pasted above
/*Promotes Integer type to one up in size range*/
template<class Integer>
struct Promote
{
static_assert(std::is_integral<Integer>::value,"Non Integer type is not allowed.");
/*Check correct type - depending on Integer being signed or unsigned*/
typedef typename std::conditional<std::is_signed<Integer>::value,
boost::mpl::vector<signed char,short,int,long,long long>,
boost::mpl::vector<unsigned char,unsigned short,unsigned int,long,long long>
>::type types;
/*
Find this type from the list above - substituting Integer for signed or unsigned char iff Integer is of type char
*/
typedef typename boost::mpl::find<types,
typename std::conditional<Is_Char<Integer>::value,
typename std::conditional<std::is_signed<Integer>::value,signed char,unsigned char>::type, Integer>::type>::type this_type;
/*If Integer is int and if size of it is == to long promote int to long long (iterate to next element twice)*/
typedef typename boost::mpl::eval_if<boost::mpl::bool_<((std::is_same<Integer,int>::value || std::is_same<Integer,unsigned int>::value)
&& (sizeof(int) == sizeof(long)))>,
boost::mpl::next<typename boost::mpl::next<this_type>::type>,
boost::mpl::next<this_type>
>::type next_type;
/*Check if iterator points within range or if one pass end which means that Integer was u/long long*/
typedef typename std::conditional<std::is_same<typename boost::mpl::end<types>::type,next_type>::value,Integer,typename boost::mpl::deref<next_type>::type>::type type;
};
#endif // PROMOTE_H_INCLUDED
My guess is that you’re not specifying--std=c++0xwhen compiling, so C++11 features such asstd::is_integral<>aren’t available. Your code compiles for me when I use that option.UPDATE: now that you’ve shown the compiler output, the problem is that you’ve enabled just about every possible warning, and also set
-Wpedantic-errorsto treat some of them as errors. Many of these warnings are triggered by perfectly sensible code, and most authors (including Boost) won’t have taken the time to fix or work around all of them.You should certainly remove
-Wpedantic-errors, unless you have a particular requirement that no code should ever use compiler-specific extensions; in that case, you probably can’t use Boost. It would probably be a good idea to disable some of the less useful warnings too – you can’t fix the ones that Boost generates, so all they do is make it harder to spot genuine warnings about your code. I generally aim to compile cleanly with-Wall -Wextra.