Невозможно скомпилировать код с помощью gcc 4.6.1. - PullRequest
0 голосов
/ 27 октября 2011

Этот код ниже компилируется нормально с VS2010, но не хочет компилироваться с gcc 4.6.1 .:

#ifndef IS_CHAR_H_INCLUDED
#define IS_CHAR_H_INCLUDED
#include <type_traits>

template<class Int_T>
struct Is_Char_
{
    enum {value = false};
};

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

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

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

template<class Int_T>
struct Is_Char : Is_Char_<typename std::remove_cv<Int_T>::type>
{

};

#endif // IS_CHAR_H_INCLUDED

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

#endif // PROMOTE_H_INCLUDED

Ответы [ 3 ]

1 голос
/ 27 октября 2011

Я предполагаю, что вы не указываете --std=c++0x при компиляции, поэтому функции C ++ 11, такие как std::is_integral<>, недоступны.Ваш код компилируется для меня, когда я использую эту опцию.

ОБНОВЛЕНИЕ: теперь, когда вы показали вывод компилятора, проблема в том, что вы включили практически все возможные предупреждения, а также установили -Wpedantic-errors рассматривать некоторые из них как ошибки.Многие из этих предупреждений вызываются совершенно разумным кодом, и большинству авторов (включая Boost) не потребуется время, чтобы исправить или обойти все из них.

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

0 голосов
/ 29 октября 2011

Выполнить точную команду g++ внутри терминала.Тогда вы увидите ошибки.Не используйте IDE для этого.

0 голосов
/ 27 октября 2011

Реальная проблема не в вашем коде.Проблема в том, что вы не можете найти сообщения об ошибках компилятора.Исправьте эту проблему, прежде чем делать что-либо еще!

...