Не вдається скомпілювати код за допомогою 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 я вказав g ++ як компілятор mingw32-g ++
додано Автор smallB, джерело
@Rob немає повідомлень про помилку. Я провів останні чотири дні, намагаючись це зробити.
додано Автор 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.

UPDATE: тепер, коли ви показали вихід компілятора, проблема полягає в тому, що ви включили майже кожне можливе попередження, а також встановили -Wpedantic-errors , щоб розглянути деякі з них як помилки. Багато хто з цих попереджень викликано ідеально чутливим кодом, і більшість авторів (включаючи Boost) не встигли замислитись над усіма ними.

Ви обов'язково повинні видалити -Wpedantic-errors , якщо у вас немає особливих вимог, щоб коди ніколи не використовували розширення, специфічні для компілятора; у такому випадку ви, напевно, не можете використовувати Boost. Можливо, було б добре відключити деякі з менш корисних попереджень - ви не можете виправити ті, які Boost генерує, так що все, що вони роблять, ускладнює виявлення справжніх попереджень про ваш код. Зазвичай я намагаюся скомпілювати з використанням -Wall -Wextra .

1
додано
Це -std = c + + 0x : один тире, а не два, але я думаю, це те, що ви використовували обидва, інакше драйвер компілятора скаржиться на невизнаний варіант ...
додано Автор rubenvb, джерело
@ Майк Сеймур Ей, Майк, він працює зараз! Дійсно, роблячи тільки -Wall і -Wextra, здається, це робить. Я трохи дивовижний, хоча, тому що я очікував прискорення, щоб відповідати STD на кожному дюймі. У всякому разі, велике спасибі за вашу допомогу.
додано Автор smallB, джерело
Як я можу додати бібліотеки підсилення до за умовчанням?
додано Автор smallB, джерело
Як це можливо, що цей самий компілятор компілює цей код і ні? Я спробував gcc 4.6 і так, цей код компілює з ним добре, але не з gcc 4.6.1
додано Автор smallB, джерело
коли я намагався скомпілювати те, що ви показали, я отримую помилку від gcc, що повідомляє невизнану опцію -4.6.1
додано Автор smallB, джерело
не вказавши каталоги boost?
додано Автор 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, джерело
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147