Привет всем!
Я пытаюсь сделать шаблонный граф с возможностью выбора хранилища для рёбер (как в 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();
}