GCC 4.6.1 kodini kompilyatsiya qila olmaydi

Quyidagi kod VS2010 bilan yaxshi tuziladi, lekin gcc 4.6.1 bilan kompilyatsiya qilishni istamaydi:

#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
Compilerdan olgan xatolarni qo'sha olasizmi?
qo'shib qo'ydi muallif Ciaran, manba
1-savol, chunki siz savol bermadingiz va muammoning echimiga hech qanday kuch sarflamaysiz. Qanday qilib uni tuzishga harakat qilganingizni ko'rsating. Xato xabarlarini ko'rsatish (birinchisidan boshlash). Kodning birinchi xatosi qaerda joylashganligini ko'rsating.
qo'shib qo'ydi muallif Rob Kennedy, manba
Xo'sh, to'g'ri, @Mike. Men -Werror ni o'ylab qoldim, lekin bu holda bu narsa mavjud emas.
qo'shib qo'ydi muallif Rob Kennedy, manba
Agar siz xato xabarlarini ko'rmasangiz, unda siz etarli darajada qidirmagansiz. Ular bir joyda bor. Agar kerak bo'lsa buyruqlar satriga derazani ishga tushiring. Lekin birinchi bo'lib "Xabarlarni yaratish" yorlig'iga qarang.
qo'shib qo'ydi muallif Rob Kennedy, manba
Sizda - "yomon xatolar" o'rnatilganligi sababli, undagi hamma narsa xato.
qo'shib qo'ydi muallif Rob Kennedy, manba
@rob bu erda ushbu faylni yaratishga urinish bo'yicha jurnal: pastebin.com/DW3T5D8F da berilgan har qanday xatolarni toping.
qo'shib qo'ydi muallif smallB, manba
@MikeSeymour Men kodni ishlataman :: bloklar, toolchainda g ++ kompilyatori sifatida mingw32-g ++
qo'shib qo'ydi muallif smallB, manba
@Robda xatoliklar ko'rsatilmagan. Men oxirgi to'rt kundan beri uni bajarishga harakat qildim.
qo'shib qo'ydi muallif smallB, manba
va bu -1 uchunmi?
qo'shib qo'ydi muallif smallB, manba
@JimClay Men aminmanki, buni o'zingiz uchun sinab ko'ring.
qo'shib qo'ydi muallif smallB, manba
@Patrick Duglas && Ciaran bu erda qiziqarli narsa xatolar ro'yxatda yo'q - xatolar borligini ko'rsatadigan yagona satr || === Xulosa tugadi: 59 xato, 152 ogohlantirish (0 daqiqa, 40 soniya) === |. O'ylaymanki, siz o'zingiz uchun tuzish uchun harakat qilsangiz yaxshi bo'lardi va men nima haqida gapirayotganimni ko'rasiz.
qo'shib qo'ydi muallif smallB, manba
@RobKennedy: bu parametr faqat birinchi xatodan keyin derleyici to'xtashini oladi. Ogohlantirishlarning aksariyat qismi faqat ogohlantirishlar, ammo -Wpedantic-errors ba'zi kamroq foydali ogohlantirishlarni xatolarga aylantiradi.
qo'shib qo'ydi muallif Mike Seymour, manba
Xo'sh, kodni qanday qilib tuzasiz? Siz to'g'ridan-to'g'ri g ++ deb qo'ng'iroq qila olmaysiz yoki xato xabarlarini ko'rasiz. Siz make ni ishlatasizmi? Yoki IDE? Yoki yana bir narsa bormi? Xato xabari ko'rsatilmaguncha sizga yordam bera olmaymiz - men (va mening kompilyatorim) ko'ra oladigan bo'lsak, bu kod yaxshi.
qo'shib qo'ydi muallif Mike Seymour, manba
Gcc tomonidan qanday xato xabar qilingan?
qo'shib qo'ydi muallif Douglas Leeder, manba
Xato xabarlarini yashiradigan ba'zi bir qurish dasturini yoki makefillardan foydalanmayotganingizga aminmisiz?
qo'shib qo'ydi muallif Jim Clay, manba
Xato xabarini qo'shing.
qo'shib qo'ydi muallif Patrick, manba

3 javoblar

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.

UPDATE: Endi siz kompilyator chiqimini namoyish qildingiz, muammo har qanday ehtimoliy ogohlantirishni yoqdi va ba'zi xatolarni davolash uchun -Wpedantic-errors ni o'rnatdi. Ushbu ogohlantirishlarning aksariyati juda aniq kod bilan boshlanadi va ko'pchilik mualliflar (jumladan, Boost) ularning barchasini tuzatish yoki ishlash uchun vaqt topa olmaydi.

Hech qanday kod hech qanday kompilyatorga xos kengaytmani ishlatmasligi kerak bo'lgan maxsus talabga ega bo'lmasangiz, albatta -Wpedantic-errors ni olib tashlashingiz kerak; Bunday holda siz Boost-dan foydalana olmaysiz. Ehtimol, ba'zi kamroq foydali ogohlantirishlarni o'chirib qo'yish yaxshi fikr edi, Boost yaratgan narsalarni tuzatolmaysiz, shuning uchun ularning barchasi sizning kodingiz to'g'risida haqiqiy ogohlantirishlarni aniqlashni qiyinlashtiradi. Odatda, -Wall -Wextra bilan toza tarzda to'plashni maqsad qilaman.

1
qo'shib qo'ydi
Bu -std = c ++ 0x : bitta chiziq emas, ikkita emas, lekin ikkalangiz ham foydalangansiz, aks holda kompilyator drayveri tanib olinmagan variant haqida shikoyat qiladi ...
qo'shib qo'ydi muallif rubenvb, manba
@Mike Seymour Hey Mike, hozir ishlaydi! Darhaqiqat, Valloh bilan birga ish olib boramiz, va bu, xuddi Wexterra kabi, hiyla-nayrang bilan band. Men hayratlanarli narsa emasman, chunki men har bir dyuymga mos keladigan stdni saqlashni istadim. Baribir, yordamingiz uchun katta rahmat.
qo'shib qo'ydi muallif smallB, manba
sukut bo'yicha kutubxonalarni qanday qo'shish mumkin?
qo'shib qo'ydi muallif smallB, manba
Qanday qilib ushbu kompilyator ushbu kodni tuzishi mumkin va shunday emasmi? Men gcc 4.6 ni sinab ko'rdim va ha bu kodi u bilan tuzilgan, lekin gcc 4.6.1 bilan emas
qo'shib qo'ydi muallif smallB, manba
Men siz ko'rsatgan narsalar bilan kompilyatsiya qilishni sinab ko'rganimda, gcc-ning taniqli variantini aytib berishini xato qilyapman -4.6.1
qo'shib qo'ydi muallif smallB, manba
boost kataloglarini ko'rsatmasdan?
qo'shib qo'ydi muallif smallB, manba
va gcc 4.6.1 dan foydalanmoqdasiz?
qo'shib qo'ydi muallif smallB, manba
noto'g'ri taxmin qilish;)
qo'shib qo'ydi muallif smallB, manba
Ha. Mening buyruqim g ++ - 4.6.1 -c test.cpp --std = c ++ 0x bo'ldi va hech qanday xatolik bilan tuzildi.
qo'shib qo'ydi muallif Mike Seymour, manba
Ular mening ko'rsatuvimga qo'shilish yo'lida bo'lamiz.
qo'shib qo'ydi muallif Mike Seymour, manba
Turli xil nomlar bilan bir necha xil versiyalar o'rnatilgan. g ++ -c test.cpp --std = c ++ 0x ni ishlating
qo'shib qo'ydi muallif Mike Seymour, manba

Terminal ichidagi to'liq g ++ buyrug'ini ishga tushiring. Siz xatolaringizni keyin ko'rasiz. Buning uchun IDE foydalanmang.

0
qo'shib qo'ydi

Haqiqiy muammo sizning kodingizda emas. Muammo shundaki, siz kompilyatorning xato xabarlarini topa olmaysiz. Hech narsa qilmasdan oldin bu muammoni hal qiling!

0
qo'shib qo'ydi
va men sizlarga aytamanki, ro'yxatdagi xato xabarlar yo'q!
qo'shib qo'ydi muallif smallB, manba
Sizga aytamanki, ro'yxatda hech kim yo'q! Sizga aytayotganimni tushunish qanchalik qiyin?
qo'shib qo'ydi muallif smallB, manba
59 ta xato mavjud edi. Shunday qilib, bir joyda 59 ta xato xabari bor. Qaerda ekanligini bilib olishingiz kerak.
qo'shib qo'ydi muallif TonyK, manba
@smallB: Men xato xabarlaringizni topdingiz. Barakalla!
qo'shib qo'ydi muallif TonyK, manba