2011-10-27 141 views
-3

下面這段代碼編譯罰款與VS2010但並不想用gcc編譯4.6.1:不能用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

請添加錯誤消息。 – Patrick

+0

gcc報告什麼錯誤? –

+0

你能否包含你從編譯器中得到的錯誤? – Ciaran

回答

1

我的猜測是,你不指定 --std=c++0x編譯時,所以C++ 11功能(例如 std::is_integral<>)不可用。當我使用該選項時,您的代碼會爲我編譯。

更新:現在您已經顯示編譯器輸出,問題是您已啓用幾​​乎所有可能的警告,並且還設置-Wpedantic-errors將其中一些視爲錯誤。這些警告中的很多是由完全合理的代碼觸發的,大多數作者(包括Boost)都沒有花時間修復或解決所有這些警告。

除非您有特殊要求,否則代碼應該使用編譯器特定的擴展名,否則您當然應該刪除-Wpedantic-errors;在這種情況下,你可能不能使用Boost。禁用一些不太有用的警告可能是一個好主意 - 你不能修復Boost生成的警告,所以他們所做的只是使得難以發現有關代碼的真正警告。我通常旨在與-Wall -Wextra乾淨地編譯。

+0

錯誤的猜測;) – smallB

+0

和你使用的是gcc 4.6.1嗎? – smallB

+0

是的。我的命令是'g ++ - 4.6.1 -c測試。cpp --std = C++ 0x',並且編譯時沒有錯誤。 –

0

真正的問題不在您的代碼中。問題是你找不到編譯器的錯誤信息。在做任何事之前修復這個問題!

+0

,我告訴你沒有錯誤消息列出! – smallB

+0

有59個錯誤。所以有59個錯誤消息。你必須找出在哪裏。 – TonyK

+0

,我告訴你,沒有列出!理解我告訴你的是多麼困難?! – smallB

0

在終端內運行確切的g++命令。那麼你會看到錯誤。不要爲此使用IDE。