Генератор типов на C++ и портабельность
От: eaglus Россия  
Дата: 19.10.05 14:55
Оценка:
Привет всем!
Я пытаюсь сделать шаблонный граф с возможностью выбора хранилища для рёбер (как в boost graph library).
Беда в том, что он должен быть портабелен на несколько компиляторов (gcc >=3, и, возможно, gcc 2.95/96, ещё сановский под солярку, последний, наверное, ещё VS 2003, а ещё что, не знаю пока).

Вот делаю селектор контейнеров, и думаю, насколько он портабален.

gcc-mingw-3.2 компилит без ворнингов, VS8 тоже, VS7.3 (2003) тоже.
VC6 + SP5 дохнет. Где, показано в примере. Почему-то не может достать тип из специализированного шаблонного типа.

Если забить на VC6, тогда можно считать этот код портабельным или нет?
Он вообще стандарту насколько хорошо соответствует?



#include <vector> 
#include <list> 
#include <iostream>

using namespace std;


struct empty_type {};

struct vecS   {};
struct listS  {};

template <class Sel> struct ContTraits
{
  template <class T> struct bind_
  {
    typedef empty_type type;
  };
};

template <> struct ContTraits<listS>
{
  template <class T> struct bind_
  {    
    typedef std::list<T> type;        
  };
};

template <class EdgeData, class EdgeContSel>
class Graph {

  struct stored_edge  {
    int v; int s; EdgeData data;
    
    stored_edge(const int v_, const int s_,  const EdgeData& data_)
      : v(v_), s(s_), data(data_) { }
    
    stored_edge(const stored_edge& rhs) : v(rhs.v), s(rhs.s), data(rhs.data)
    { }    
  };
    
  typedef typename ContTraits<EdgeContSel>::template bind_<stored_edge> ste_cont;
    
  typename ste_cont::type m_edge_store;/// VC6.5  error C2039: 'type' : is not a member of '`global namespace''
  //И потом тут кучей:
  //error C2501: 'm_edge_store' : missing storage-class or type specifiers
  //fatal error C1004: unexpected end of file found
  //see reference to class template instantiation 'Graph<double,struct listS>' being compiled
  
public:    
    void add_edge() {
      m_edge_store.push_back(stored_edge(1, 2, 3.0));    
    }
};

typedef Graph<double, listS> MyGraph;

int main()
{    
  MyGraph gr;
  gr.add_edge();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.