Ошибка C2039 в классе повышения с Boost 1.34.1 на VC6 - PullRequest
0 голосов
/ 23 мая 2011

Немного истории: я изначально хотел использовать boost для ASIO, но потом обнаружил, что ASIO не будет работать с VC ++ 6.0 (что является обязательным требованием).Включая повышение, я нашел использование для Multi_Index_Container и Signals.Обнаружив, что ASIO не совместим, я снизил версию до версии 1.34.1, чтобы она поддерживала VC6.Теперь я пытаюсь сгладить все остальные ошибки компиляции.

Сначала у меня был этот код и ошибка: я пытаюсь использовать Boost Multi_Index из сборки 1.34.1 для настройки коллекции структур,Этот многоиндексный контейнер будет иметь 2 уникальных ключа (ID и имя), так как я должен иметь возможность искать его по любому ключу.Я внес исправления для компилятора для VC ++ 6.0 SP5:

boost::multi_index::multi_index_container
member_offset<A,int,offsetof(A,x)>

Мое полное объявление:

enum RESPONSE_CODES
{
    Pass = 200,
    Fail = 201,
    Hex = 202,
    Decimal = 203,
    String = 204,
    Help = 205,
    None = 255
}

struct PDCUTestMessage
{
    string name;
    char id;
    RESPONSE_CODES responseType;
    int numberOfParameters;
    string errorString;
    vector<char> response;
    string param1Name;
    string param2Name;
    string param3Name;
    string param4Name;
    string param5Name;
    boost::function2<bool, vector<char>, PDCUTestMessage &> process;

    // constructors not listed
};

struct ID();
struct Name();

typedef boost::multi_index::multi_index_container<
    PDCUTestMessage,
    boost::multi_index::ordered_unique<
        boost::multi_index::tag<ID>,
        boost::multi_index::member_offset<PDCUTestMessage, char, offsetof(PDCUTestMessage, id)> >,
    boost::multi_index::ordered_unique<
        boost::multi_index::tag<Name>,
        boost::multi_index::member_offset<PDCUTestMessage, string, offsetof(PDCUTestMessage, name)> >
    >
> PDCUMessageList;

Позже я пытаюсь настроить индикаторы для обоих этих ключей, в соответствии св VC ++ 6.0 специфичный для компилятора синтаксис, чтобы обойти проблему Get / Tag:

typedef index<PDCUMessageList, ID>::type IDIndex;
typedef index<PDCUMessageList, Name>::type NameIndex;

, используя приведенный выше код, я получил следующую ошибку:

ошибка C2039: «тип»: нетчлен "глобального пространства имен", ссылающийся на две строки typedef выше.

Эту проблему я исправил, уточнив пространства имен:

typedef boost::multi_index::index<PDCUMessageList, ID>::type IDIndex;
typedef boost::multi_index::index<PDCUMessageList, Name>::type NameIndex;

Теперь у меня возникла другая ошибка в одной изклассы повышения: lambda_traits.hpp.Я не использую явно lambda_traits, поэтому это должен быть multi_index, который его использует.Вот ошибка и местоположение:

C2039: 'access_traits': не является членом 'кортежей'

строка 106 в lambda_traits:

104  template<int N, class T> struct tuple_element_as_reference {
105    typedef typename
106      boost::tuples::access_traits<
107        typename boost::tuples::element<N, T>::type
108      >::non_const_type type;
109  };

У кого-нибудь есть идеикак пройти эту последнюю ошибку?

1 Ответ

0 голосов
/ 23 мая 2011

Насколько я помню, разбор шаблонов в VC6 просто неудобен. Постарайтесь максимально упростить зависимые типы. Например:

template<int N, class T> struct tuple_element_as_reference {
  typedef typename boost::tuples::element<N, T>
     tuples_element_t;

  typedef typename tuples_element_t::type
     tuples_element_type_t;

  typedef typename boost::tuples::access_traits<
     tuples_element_type_t
  >
     tuples_access_traits_t;

  typedef typename tuples_access_traits_t::non_const_type
     type;
};
...