Kod gcc 4.6.1 ile derlenemiyor

Aşağıdaki kod VS2010 ile para cezası derler ancak gcc 4.6.1 ile derlemek istemez .:

#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
Derleyiciden aldığınız hataları dahil edebilir misiniz?
katma yazar Ciaran, kaynak
-1, bir soru sormadığınız ve probleminize hiç çaba sarf ettiğinize dair hiçbir gösterge vermediğiniz içindir. Nasıl derlemeye çalıştığını göster. Hata mesajlarından bazılarını göster (birincisinden başlayarak). Kodda ilk hatanın nerede oluştuğunu gösterin.
katma yazar Rob Kennedy, kaynak
Ah, haklısın, @Mike. -Werror 'ı düşünüyordum, fakat bu durumda bu yok.
katma yazar Rob Kennedy, kaynak
Hata mesajları görmüyorsanız, yeterince sert görünmüyorsunuz demektir. Bir yerlerde varlar. Gerekirse, derleyicinizi komut satırından çalıştırın. Ancak önce "Mesaj oluştur" sekmesine bakın.
katma yazar Rob Kennedy, kaynak
-Wfatal-error ayarınız olduğundan, listelenen her şey bir hatadır.
katma yazar Rob Kennedy, kaynak
@ rob, bu dosyanın oluşturulmaya çalışılmasının günlüğüdür: pastebin.com/DW3T5D8F listelenen hataları bulur.
katma yazar smallB, kaynak
@MikeSeymour code :: blokları kullanıyorum, araç zincirinde g ++ derleyici olarak belirttim mingw32-g ++
katma yazar smallB, kaynak
@Rob görüntülenen hiçbir hata mesajı yok. Son dört gününü bunu yapmaya çalışarak geçirdim.
katma yazar smallB, kaynak
ve bu -1 ne içindir?
katma yazar smallB, kaynak
@JimClay Eminim kendiniz deneyin.
katma yazar smallB, kaynak
@Patrick Douglas & & Ciaran burada ilginç olan şey hataların listelenmemiş olmasıdır - hataların olduğunu gösteren tek satır || === İnşa bitti: 59 hata, 152 uyarı (0 dakika, 40 saniye) === |. Bence kendiniz için derlemeye çalışırsanız ve neden bahsettiğimi görürsünüz, en iyisi olacağını düşünüyorum.
katma yazar smallB, kaynak
@RobKennedy: bu seçenek sadece derleyiciyi ilk hatadan sonra durdurur. Uyarıların çoğu hala yalnızca uyarılardır, ancak -Wpedantic-error daha az yararlı uyarılardan bazılarını hatalara dönüştürür.
katma yazar Mike Seymour, kaynak
Peki kodu tam olarak nasıl oluşturuyorsun? Doğrudan g ++ 'u arayamazsınız veya hata mesajlarını görürsünüz. make 'ı kullanıyor musunuz? Veya bir IDE? Veya başka bir şey? Hata mesajını göstermediğiniz sürece size yardımcı olamayız - ben (ve derleyicimin) görebildiğim kadarıyla bu kod iyi.
katma yazar Mike Seymour, kaynak
Gcc tarafından hangi hata bildirildi?
katma yazar Douglas Leeder, kaynak
Bazı oluşturma yardımcı programı veya hata iletilerini gizleyen makefile kullanmadığınızdan emin misiniz?
katma yazar Jim Clay, kaynak
Lütfen hata mesajını ekleyin.
katma yazar Patrick, kaynak

3 cevap

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.

GÜNCELLEME: şimdi derleyici çıktısını gösterdiğinize göre, sorun hemen hemen tüm uyarıları etkinleştirmiş olmanız ve ayrıca bazılarına hata olarak bakacak şekilde -Wpedantic-errors 'u ayarlamanızdır. Bu uyarıların çoğu, mantıklı bir kodla tetiklenir ve çoğu yazar (Boost dahil) hepsini düzeltmek veya üzerinde çalışmak için zaman harcamaz.

Hiçbir kodun derleyiciye özgü uzantıları kullanmaması gerektiğine dair belirli bir gereksiniminiz yoksa kesinlikle -Wpedantic-errors öğesini kaldırmalısınız; Bu durumda, muhtemelen Boost kullanamazsınız. Daha az yararlı olan bazı uyarıları da devre dışı bırakmak muhtemelen iyi bir fikir olacaktır - Boost'un ürettiği uyarlamaları düzeltemezsiniz, bu yüzden tek yaptıkları kodunuzla ilgili gerçek uyarıları tespit etmeyi zorlaştırmaktır. Genelde -Wall -Wextra ile temiz bir şekilde derlemeyi hedefliyorum.

1
katma
-std = c ++ 0x : bir satır, iki değil, ama sanırım ikinizin de kullandığı şey, aksi takdirde derleyici sürücüsü tanınmayan bir seçenek hakkında şikayet eder ...
katma yazar rubenvb, kaynak
@Mike Seymour Hey Mike, şimdi çalışıyor! Nitekim sadece -Wall ve -Wextra ile uğraşmak hile yapmak gibi görünüyor. Yine de şaşırdım, çünkü artışın her santilde uyumlu olmasını bekliyordum. Neyse, yardımın için teşekkürler.
katma yazar smallB, kaynak
boost kütüphanelerini varsayılan dahil etme yoluna nasıl ekleyebilirim?
katma yazar smallB, kaynak
Aynı derleyicinin bu kodu derlemesi ve vermemesi nasıl mümkün olabilir? Gcc 4.6'yı denedim ve evet, bu kod onunla uyumludur ancak gcc 4.6.1 ile
katma yazar smallB, kaynak
gösterdiklerinizle derlemeyi denediğimde, gcc tanınmayan seçeneği söylerken hata alıyorum
katma yazar smallB, kaynak
boost dizinleri belirtmeden?
katma yazar smallB, kaynak
ve gcc 4.6.1 kullanıyor musunuz?
katma yazar smallB, kaynak
s yanlış tahmin;)
katma yazar smallB, kaynak
Evet. Komutum g ++ - 4.6.1 -c test.cpp --std = c ++ 0x idi ve hatasız olarak derlendi.
katma yazar Mike Seymour, kaynak
Benim varsayılan dahiliyetim yolundalar.
katma yazar Mike Seymour, kaynak
Farklı isimlerle yüklenen farklı versiyonlarım var. g ++ -c test.cpp --std = c ++ 0x yöntemini deneyin.
katma yazar Mike Seymour, kaynak

Bir terminal içindeki kesin g ++ komutunu çalıştırın. Hataları göreceksin o zaman. Bunun için bir IDE kullanmayın.

0
katma

Asıl sorun kodunuzda değil. Sorun, derleyicinin hata mesajlarını bulamamanızdır. Başka bir şey yapmadan önce bu sorunu düzeltin!

0
katma
ve size listelenen hata mesajlarının olmadığını söylüyorum!
katma yazar smallB, kaynak
ve size listelenen hiçbiri olmadığını söylüyorum! Sana ne dediğimi anlamak ne kadar zor ?!
katma yazar smallB, kaynak
59 hata vardı. Yani bir yerde 59 hata mesajı var. Nerede olduğunu bulmak zorundasın.
katma yazar TonyK, kaynak
@smallB: Hata mesajlarınızı bulduğunuzu görüyorum. Aferin!
katma yazar TonyK, kaynak