【发布时间】:2011-10-27 15:45:40
【问题描述】:
下面的这段代码可以用 VS2010 编译,但不想用 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
【问题讨论】:
-
请添加错误信息。
-
您确定您没有使用一些隐藏错误消息的构建实用程序或生成文件吗?
-
-1 是因为您没有提出问题,也没有表明您已经为解决问题付出了任何努力。显示您如何尝试编译它。显示一些错误消息(从第一条开始)。显示代码中第一个错误发生的位置。
-
如果您没有看到错误消息,则说明您还不够努力。它们存在于某处。如果必须,请在命令行上运行编译器。但首先,请查看“构建消息”选项卡。
-
由于您设置了
-Wfatal-errors,因此列出的所有内容都有错误。