Kan geen code compileren met gcc 4.6.1

Deze code compileert prima met VS2010 maar wil niet compileren met 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
Kun je de fouten die je van de compiler krijgt opnemen?
toegevoegd de auteur Ciaran, de bron
De -1 is omdat je geen vraag hebt gesteld en je hebt geen enkele aanwijzing gegeven dat je überhaupt enige moeite hebt gedaan met je probleem. Laat zien hoe je het probeerde te compileren. Toon enkele van de foutmeldingen (beginnend met de eerste). Laat zien waar in de code de eerste fout voorkomt.
toegevoegd de auteur Rob Kennedy, de bron
Ah, je hebt gelijk, @Mike. Ik dacht aan -Werror , maar die is in dit geval niet aanwezig.
toegevoegd de auteur Rob Kennedy, de bron
Als je geen foutmeldingen ziet, dan kijk je niet hard genoeg. Ze bestaan ​​ergens. Voer uw compiler uit op de opdrachtregel als dat nodig is. Maar kijk eerst naar het tabblad "Berichten bouwen".
toegevoegd de auteur Rob Kennedy, de bron
Omdat je -Wfatale-fouten hebt ingesteld, bevat alles wat daar staat een fout.
toegevoegd de auteur Rob Kennedy, de bron
@rob hier is het logboek van de poging tot het bouwen van dit bestand: pastebin.com/DW3T5D8F vindt u eventuele fouten.
toegevoegd de auteur smallB, de bron
@MikeSeymour Ik gebruik code :: blocks, in toolchain heb ik g ++ opgegeven als een compiler mingw32-g ++
toegevoegd de auteur smallB, de bron
@Rob er worden geen foutmeldingen weergegeven. Ik heb de afgelopen vier dagen geprobeerd om het te doen.
toegevoegd de auteur smallB, de bron
en deze -1 is voor?
toegevoegd de auteur smallB, de bron
@JimClay Ik weet het zeker, probeer het voor jezelf.
toegevoegd de auteur smallB, de bron
@Patrick Douglas && Ciaran het interessante hier is dat fouten niet worden vermeld - de enige regel die aangeeft dat er fouten zijn is || === Build finished: 59 errors, 152 warnings (0 minutes, 40 seconds) === |. Ik denk dat het het beste is als je het voor jezelf compileert en je zult zien waar ik het over heb.
toegevoegd de auteur smallB, de bron
@RobKennedy: die optie zorgt ervoor dat de compiler stopt na de eerste fout. De meeste waarschuwingen zijn nog steeds slechts waarschuwingen, maar -Wantante fouten veranderen enkele van de minder nuttige waarschuwingen in fouten.
toegevoegd de auteur Mike Seymour, de bron
Dus hoe precies bouw je de code? Je kunt niet rechtstreeks g ++ aanroepen, anders krijg je de foutmeldingen te zien. Gebruikt u make ? Of een IDE? Of iets anders? We kunnen je niet helpen tenzij je de foutmelding laat zien - voor zover ik (en mijn compiler) kan zien, is deze code prima.
toegevoegd de auteur Mike Seymour, de bron
Welke fout wordt gerapporteerd door gcc?
toegevoegd de auteur Douglas Leeder, de bron
Weet je zeker dat je geen build-hulpprogramma of makefile gebruikt dat de foutmeldingen verbergt?
toegevoegd de auteur Jim Clay, de bron
Voeg de foutmelding alsjeblieft toe.
toegevoegd de auteur Patrick, de bron

3 antwoord

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: nu dat je de compiler-uitvoer hebt getoond, is het probleem dat je zo ongeveer elke mogelijke waarschuwing hebt ingeschakeld en ook -Wantantic-errors hebt ingesteld om een ​​aantal ervan als fouten te behandelen. Veel van deze waarschuwingen worden veroorzaakt door perfect bruikbare code, en de meeste auteurs (inclusief Boost) hebben niet de tijd genomen om ze allemaal op te lossen of te omzeilen.

Je moet zeker -Wpedantic-errors verwijderen, tenzij je een specifieke vereiste hebt dat geen enkele code ooit compiler-specifieke extensies mag gebruiken; in dat geval kunt u Boost waarschijnlijk niet gebruiken. Het zou waarschijnlijk een goed idee zijn om enkele van de minder nuttige waarschuwingen ook uit te schakelen - je kunt degenen die Boost genereert niet herstellen, dus alles wat ze doen is het moeilijker maken om echte waarschuwingen over je code te herkennen. Ik probeer over het algemeen schoon te compileren met -Wall -Wextra .

1
toegevoegd
Het is -std = c ++ 0x : één streepje, niet twee, maar ik neem aan dat dat wat jullie allebei hebben gebruikt, anders zou de compiler-driver klagen over een niet-herkende optie ...
toegevoegd de auteur rubenvb, de bron
@Mike Seymour Hey Mike, het werkt nu! Inderdaad doet gewoon doen met -Wall en -Wextra lijkt de truc te doen. Ik ben echter een beetje verrassend, want ik verwachtte dat de boost standaard zou worden in elke inch. Hoe dan ook, hartelijk dank voor je hulp.
toegevoegd de auteur smallB, de bron
hoe kan ik boost-bibliotheken standaard toevoegen aan pad?
toegevoegd de auteur smallB, de bron
hoe is het mogelijk dat dezelfde compiler deze code compileert en niet? Ik heb gcc 4.6 geprobeerd en ja, deze code compileert goed, maar niet met gcc 4.6.1
toegevoegd de auteur smallB, de bron
wanneer ik heb geprobeerd te compileren met wat je hebt laten zien, krijg ik een foutmelding van gcc met de niet-herkende optie -4.6.1
toegevoegd de auteur smallB, de bron
zonder specificatie boost-mappen?
toegevoegd de auteur smallB, de bron
en gebruikt u gcc 4.6.1?
toegevoegd de auteur smallB, de bron
s verkeerde gok;)
toegevoegd de auteur smallB, de bron
Ja. Mijn opdracht was g ++ - 4.6.1 -c test.cpp --std = c ++ 0x en is gecompileerd zonder fouten.
toegevoegd de auteur Mike Seymour, de bron
Ze staan ​​standaard in mijn pad.
toegevoegd de auteur Mike Seymour, de bron
Ik heb verschillende versies geïnstalleerd, met verschillende namen. Probeer g ++ -c test.cpp --std = c ++ 0x
toegevoegd de auteur Mike Seymour, de bron

Voer de exacte opdracht g ++ in een terminal uit. Je zult de fouten dan zien. Gebruik daarvoor geen IDE.

0
toegevoegd

Het echte probleem zit niet in je code. Het probleem is dat je de foutmeldingen van de compiler niet kunt vinden. Los dat probleem op voordat je iets anders doet!

0
toegevoegd
en ik zeg je dat er geen foutmeldingen worden vermeld!
toegevoegd de auteur smallB, de bron
en ik zeg je dat er geen zijn vermeld! Hoe moeilijk is het om te begrijpen wat ik je vertel ?!
toegevoegd de auteur smallB, de bron
Er waren 59 fouten. Er zijn dus 59 foutmeldingen. Je moet uitvinden waar.
toegevoegd de auteur TonyK, de bron
@ smallB: Ik zie dat je je foutmeldingen hebt gevonden. Goed gedaan!
toegevoegd de auteur TonyK, de bron