Ошибка компиляции аллокаторов в VS7.1 и MinGW и Comeau :)

Тема в разделе "LANGS.C", создана пользователем maxdiver, 11 фев 2008.

  1. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Пытаюсь заюзать аллокаторы, в моей студии 2008 всё компилируется, в 2005 тоже вроде должно работать (раньше подобное писал), а теперь пытаюсь отослать решение на сайт (олимпиадный), и получаю Compilation Error. К сожалению, текст ошибки он не выдаёт :dntknw:
    Собственно просьба откомпилировать это дело на студии 7.1 и выложить сюда вывод компилятора.
    Код (Text):
    1. #define _CRT_SECURE_NO_DEPRECATE
    2. #include <algorithm>
    3. #include <memory>
    4. #include <iostream>
    5. #include <map>
    6. #include <vector>
    7.  
    8. using namespace std;
    9.  
    10.  
    11. template <class T>
    12. class myalloc : public allocator<T>
    13. {
    14.     static const size_t sz = 1000*1000;
    15.     static bool was_init;
    16.     static T * h;
    17.     static vector<size_t> * q;
    18.  
    19. public:
    20.  
    21.     template<class _Other>
    22.     struct rebind {
    23.         typedef myalloc<_Other> other;
    24.     };
    25.  
    26.     myalloc() { }
    27.     myalloc (const allocator<T> & right) { }
    28.  
    29.     void init()
    30.     {
    31.         q = new vector<size_t>;
    32.         for (size_t i=0; i<sz; ++i)
    33.             q->push_back (sz-i-1);
    34.         h = (T*) new char [sz * sizeof(T)];
    35.     }
    36.  
    37.     T * allocate (size_t)
    38.     {
    39.         if (!was_init)
    40.         {
    41.             was_init = true;
    42.             init();
    43.         }
    44.         size_t pos = q->back();
    45.         q->pop_back();
    46.         return h+pos;
    47.     }
    48.  
    49.     void deallocate (T * ptr, size_t)
    50.     {
    51.         ptr->~T();
    52.         q->push_back (ptr - h);
    53.     }
    54.  
    55. };
    56.  
    57. template <class T>
    58. bool myalloc<T>::was_init = false;
    59. template <class T>
    60. T * myalloc<T>::h = NULL;
    61. template <class T>
    62. vector<size_t> * myalloc<T>::q;
    63.  
    64.  
    65.  
    66. typedef map < int, int, less<int>, myalloc < pair<const int,int> >  > map_ii;
    67. vector<map_ii> t;
    68. map_ii b;
    69.  
    70.  
    71. int main()
    72. {
    73. }
    Пробовал компилить в Comeau через их сайт, он тоже ругается, но я ошибку не понял: он не смог преобразовать allocator<tree_item<pair<int,int>>> в allocator<pair<int,int>>. Имхо это просто несовместимость с микрософтным компилером.

    Заранее благодарю.

    P.S. Если кто знает сайт, на котором можно откомпилировать код целой кучей компиляторов различных версий (вроде был такой сайт), просьба кинуть в меня ссылкой :)
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    maxdiver
    Код (Text):
    1. test.cpp
    2. C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\ostream(574) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
    3. C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\istream(828) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
    4. C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\istream(1064) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
    5. C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\map(25) : error C2248: 'myalloc<T>::rebind<_Other>::other' : cannot access inaccessible typedef declared in class 'myalloc<T>'
    6.         with
    7.         [
    8.             T=std::pair<const int,int>,
    9.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    10.         ]
    11.         and
    12.         [
    13.             T=std::pair<const int,int>
    14.         ]
    15.         test.cpp(23) : see declaration of 'myalloc<T>::rebind<_Other>::other'
    16.         with
    17.         [
    18.             T=std::pair<const int,int>,
    19.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    20.         ]
    21.         C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(23) : see reference to class template instantiation 'std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,_Mfl>' being compiled
    22.         with
    23.         [
    24.             _Kty=int,
    25.             _Ty=int,
    26.             _Pr=std::less<int>,
    27.             _Alloc=myalloc<std::pair<const int,int>>,
    28.             _Mfl=false
    29.         ]
    30.         C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(65) : see reference to class template instantiation 'std::_Tree_nod<_Traits>' being compiled
    31.         with
    32.         [
    33.             _Traits=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>
    34.         ]
    35.         C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(87) : see reference to class template instantiation 'std::_Tree_ptr<_Traits>' being compiled
    36.         with
    37.         [
    38.             _Traits=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>
    39.         ]
    40.         C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(105) : see reference to class template instantiation 'std::_Tree_val<_Traits>' being compiled
    41.         with
    42.         [
    43.             _Traits=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>
    44.         ]
    45.         C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\map(77) : see reference to class template instantiation 'std::_Tree<_Traits>' being compiled
    46.         with
    47.         [
    48.             _Traits=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>
    49.         ]
    50.         test.cpp(68) : see reference to class template instantiation 'std::map<_Kty,_Ty,_Pr,_Alloc>' being compiled
    51.         with
    52.         [
    53.             _Kty=int,
    54.             _Ty=int,
    55.             _Pr=std::less<int>,
    56.             _Alloc=myalloc<std::pair<const int,int>>
    57.         ]
    58. C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\map(26) : error C2248: 'myalloc<T>::rebind<_Other>::other' : cannot access inaccessible typedef declared in class 'myalloc<T>'
    59.         with
    60.         [
    61.             T=std::pair<const int,int>,
    62.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    63.         ]
    64.         and
    65.         [
    66.             T=std::pair<const int,int>
    67.         ]
    68.         test.cpp(23) : see declaration of 'myalloc<T>::rebind<_Other>::other'
    69.         with
    70.         [
    71.             T=std::pair<const int,int>,
    72.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    73.         ]
    74. C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(128) : error C2248: 'myalloc<T>::rebind<_Other>::other' : cannot access inaccessible typedef declared in class 'myalloc<T>'
    75.         with
    76.         [
    77.             T=std::pair<const int,int>,
    78.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    79.         ]
    80.         and
    81.         [
    82.             T=std::pair<const int,int>
    83.         ]
    84.         test.cpp(23) : see declaration of 'myalloc<T>::rebind<_Other>::other'
    85.         with
    86.         [
    87.             T=std::pair<const int,int>,
    88.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    89.         ]
    90. C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(169) : error C2248: 'myalloc<T>::rebind<_Other>::other' : cannot access inaccessible typedef declared in class 'myalloc<T>'
    91.         with
    92.         [
    93.             T=std::pair<const int,int>,
    94.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    95.         ]
    96.         and
    97.         [
    98.             T=std::pair<const int,int>
    99.         ]
    100.         test.cpp(23) : see declaration of 'myalloc<T>::rebind<_Other>::other'
    101.         with
    102.         [
    103.             T=std::pair<const int,int>,
    104.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    105.         ]
    106. C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(170) : error C2248: 'myalloc<T>::rebind<_Other>::other' : cannot access inaccessible typedef declared in class 'myalloc<T>'
    107.         with
    108.         [
    109.             T=std::pair<const int,int>,
    110.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    111.         ]
    112.         and
    113.         [
    114.             T=std::pair<const int,int>
    115.         ]
    116.         test.cpp(23) : see declaration of 'myalloc<T>::rebind<_Other>::other'
    117.         with
    118.         [
    119.             T=std::pair<const int,int>,
    120.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    121.         ]
    122. C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(171) : error C2248: 'myalloc<T>::rebind<_Other>::other' : cannot access inaccessible typedef declared in class 'myalloc<T>'
    123.         with
    124.         [
    125.             T=std::pair<const int,int>,
    126.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    127.         ]
    128.         and
    129.         [
    130.             T=std::pair<const int,int>
    131.         ]
    132.         test.cpp(23) : see declaration of 'myalloc<T>::rebind<_Other>::other'
    133.         with
    134.         [
    135.             T=std::pair<const int,int>,
    136.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    137.         ]
    138. C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(176) : error C2248: 'myalloc<T>::rebind<_Other>::other' : cannot access inaccessible typedef declared in class 'myalloc<T>'
    139.         with
    140.         [
    141.             T=std::pair<const int,int>,
    142.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    143.         ]
    144.         and
    145.         [
    146.             T=std::pair<const int,int>
    147.         ]
    148.         test.cpp(23) : see declaration of 'myalloc<T>::rebind<_Other>::other'
    149.         with
    150.         [
    151.             T=std::pair<const int,int>,
    152.             _Other=std::_Tmap_traits<int,int,std::less<int>,myalloc<std::pair<const int,int>>,false>::value_type
    153.         ]
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.6030 for 80x86
    Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
     
  3. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Хехе. Неутешительные выводы.
    http://www.thescripts.com/forum/thread263033.html :
    :dntknw:
    попробую ещё пошаманить...
     
  4. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Убрал наследование от std::allocator, так стало компилироваться, правда, пришлось доопределить несколько функций и тупдефов.
    В общем, всем спасибо, вопрос закрыт :)