gcc 4.6.1でコードをコンパイルできない

以下のコードはVS2010でうまくコンパイルされますが、gcc 4.6.1でコンパイルしたくありません。

#ifndef IS_CHAR_H_INCLUDED
#define IS_CHAR_H_INCLUDED
#include 

template
struct Is_Char_
{
    enum {value = false};
};

template<>
struct Is_Char_
{
    enum {value = true};
};

template<>
struct Is_Char_
{
    enum {value = true};
};

template<>
struct Is_Char_
{
    enum {value = true};
};

template
struct Is_Char : Is_Char_::type>
{

};

#endif//IS_CHAR_H_INCLUDED

#ifndef PROMOTE_H_INCLUDED
#define PROMOTE_H_INCLUDED
#include 
#include 
#include 
#include 
#include 
#include 
   //#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
struct Promote
{
    static_assert(std::is_integral::value,"Non Integer type is not allowed.");
    /*Check correct type - depending on Integer being signed or unsigned*/
    typedef typename std::conditional::value,
                                boost::mpl::vector,
    boost::mpl::vector
                                     >::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::value,
    typename std::conditional::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::value || std::is_same::value)
                                                                && (sizeof(int) == sizeof(long)))>,
                                         boost::mpl::next::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::type,next_type>::value,Integer,typename boost::mpl::deref::type>::type type;
};

#endif//PROMOTE_H_INCLUDED
3
あなたはコンパイラから得たエラーを含めることができますか?
追加された 著者 Ciaran,
-1は、あなたが質問をしなかったことと、問題に何か努力をしたことをまったく示唆しなかったためです。それをどのようにコンパイルしようとしたかを示します。いくつかのエラーメッセージを表示します(最初のものから)。最初のエラーが発生したコードの場所を表示します。
追加された 著者 Rob Kennedy,
ああ、そうです、@マイク。私は -Werror を考えていましたが、この場合は存在しません。
追加された 著者 Rob Kennedy,
エラーメッセージが表示されない場合は、十分に重視していません。彼らはどこかに存在します。必要な場合は、コマンドラインでコンパイラを実行します。しかしまず、「メッセージの作成」タブを見てください。
追加された 著者 Rob Kennedy,
-Wfatal-errors が設定されているため、そこにリストされているすべてのエラーがあります。
追加された 著者 Rob Kennedy,
@robここには、このファイルの試行されたビルドからのログがあります: pastebin.com/DW3T5D8F
追加された 著者 smallB,
@MikeSeymour私はtoolchainでcode :: blocksを使用しています。コンパイラとしてg ++を指定しましたmingw32-g ++
追加された 著者 smallB,
@Robエラーメッセージは表示されません。私は最後の4日間それをやろうとした。
追加された 著者 smallB,
これは-1です
追加された 著者 smallB,
@JimClay私は確信している、あなた自身のためにそれを試してください。
追加された 著者 smallB,
@Patrick Douglas && Ciaranここで興味深いのは、エラーがリストされていないということです - エラーがあることを示す唯一の行は|| ===ビルドが終了しました:59エラー、152警告(0分、40秒)=== |。私はそれがあなた自身のためにそれをコンパイルしようとすると、あなたがあなたが話していることを見ることが最善であると思う。
追加された 著者 smallB,
@RobKennedy:このオプションは最初のエラーの後にコンパイラを停止させるだけです。大部分の警告はまだ警告に過ぎませんが、 -Wpedantic-errors はあまり有用でない警告の一部をエラーに変えます。
追加された 著者 Mike Seymour,
それでは、コードをどのくらい正確に作成していますか? g ++ を直接呼び出すことはできません。そうしないと、エラーメッセージが表示されます。 make を使用していますか?またはIDEですか?または、他の何か?私はあなたと私のコンパイラが見ることができる限り、このコードは問題ありません。
追加された 著者 Mike Seymour,
gccによってどのようなエラーが報告されますか?
追加された 著者 Douglas Leeder,
エラーメッセージを隠しているビルドユーティリティやmakefileを使用していないことを確認してください。
追加された 著者 Jim Clay,
エラーメッセージを追加してください。
追加された 著者 Patrick,

3 答え

My guess is that you're not specifying --std=c++0x when compiling, so C++11 features such as std::is_integral<> aren't available. Your code compiles for me when I use that option.

更新:コンパイラの出力が表示されたので、可能な限りすべての警告を有効にし、その一部をエラーとして扱うように -Wpedantic-errors を設定することが問題です。これらの警告の多くは完全に合理的なコードによって引き起こされ、ほとんどの著者(Boostを含む)はそれらのすべてを修正または回避する時間をとらなかったでしょう。

コンパイラ固有の拡張を使用するコードがないという特別な要件がない限り、確実に -Wpedantic-errors を削除する必要があります。その場合、おそらくBoostを使用することはできません。 Boostが生成する警告を修正することはできないので、コードに関する真の警告を見つけるのが難しくなります。私は一般的に -Wall -Wextra できれいにコンパイルすることを目指しています。

1
追加された
-std = c ++ 0x :ダッシュは2つではありませんが、どちらもあなたが使用していると思います。そうしないと、コンパイラドライバが認識できないオプションについて文句を言います。
追加された 著者 rubenvb,
@Mike Seymourちょっとマイク、それは今働く!実際に-Wallと-Wextraと一緒にやっているのは、このトリックを行うようです。私は少し驚くべきことですが、私はすべてのインチに順応するstdになることを期待しています。とにかく、お世話になりました。
追加された 著者 smallB,
どのように追加ライブラリをデフォルトのインクルードパスに追加できますか?
追加された 著者 smallB,
どのようにこの同じコンパイラがこのコードをコンパイルする可能性はありますか?私はgcc 4.6を試しましたが、このコードはgcc 4.6.1ではなく、コンパイルしても問題ありません。
追加された 著者 smallB,
あなたが表示したものでコンパイルしようとしたとき、認識できないオプションを指定しているgccからエラーが出てきます-4.6.1
追加された 著者 smallB,
ブーストディレクトリを指定しないで?
追加された 著者 smallB,
gcc 4.6.1を使用していますか?
追加された 著者 smallB,
間違った推測;)
追加された 著者 smallB,
はい。私のコマンドは g ++ - 4.6.1 -c test.cpp --std = c ++ 0x であり、エラーなしでコンパイルされました。
追加された 著者 Mike Seymour,
彼らは私のデフォルトのインクルードパスに入っています。
追加された 著者 Mike Seymour,
私はいくつかの異なるバージョンがインストールされており、名前は異なっています。 g ++ -c test.cppを試してください--std = c ++ 0x
追加された 著者 Mike Seymour,

ターミナル内で正確な g ++ コマンドを実行します。エラーが表示されます。 IDEを使用しないでください。

0
追加された

実際の問題はあなたのコードではありません。問題は、コンパイラのエラーメッセージが見つからないことです。あなたが他の何かをする前に、その問題を修正してください!

0
追加された
エラーメッセージが表示されていないことを伝えています!
追加された 著者 smallB,
私はあなたに何も記載されていないことを伝えています!私はあなたに何を言っているのか理解するのはどれくらい難しいですか?
追加された 著者 smallB,
59のエラーがありました。したがって、どこかに59のエラーメッセージがあります。あなたはどこで見つける必要があります。
追加された 著者 TonyK,
@smallB:あなたのエラーメッセージが見つかりました。よくやった!
追加された 著者 TonyK,