Bonjour à tous

Je suis en train d'essayer de comprendre le format md2 pour charger des modèles 3D de quake 2 avec opengl. Bref, j'ai recupérer un loader mais quand je le compile j'ai une erreur bizarre et ca m'envoie dans un des include de la librairie standard C++.

Voici le fichier DataManger.h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* -*- c++ -*- */
/////////////////////////////////////////////////////////////////////////////
//
// DataManager.h -- Copyright (c) 2006 David Henry
// last modification: feb. 25, 2006
//
// This code is licenced under the MIT license.
//
// This software is provided "as is" without express or implied
// warranties. You may freely copy and compile this source into
// applications you distribute provided that the copyright text
// below is included in the resulting source code.
//
// Definitions of a data manager class.
//
/////////////////////////////////////////////////////////////////////////////
 
#ifndef __DATAMANAGER_H__
#define __DATAMANAGER_H__
 
#include <stdexcept>
#include <string>
#include <map>
 
using std::string;
using std::map;
 
 
/////////////////////////////////////////////////////////////////////////////
//
// class DataManagerException - Exception class for DataManager classes.
// This acts like a standard runtime_error exception but
// know the name of the resource which caused the exception.
//
/////////////////////////////////////////////////////////////////////////////
 
class DataManagerException : public std::runtime_error
{
public:
  // Constructors
  DataManagerException (const string &error)
    : std::runtime_error (error) { }
  DataManagerException (const string &error, const string &name)
    : std::runtime_error (error), _which (name) { }
  virtual ~DataManagerException () throw () { }
 
public:
  // Public interface
  virtual const char *which () const throw () {
    return _which.c_str ();
  }
 
private:
  // Member variables
  string _which;
};
 
 
/////////////////////////////////////////////////////////////////////////////
//
// class DataManager -- a data manager which can register/unregister
// generic objects.  Destroy all registred objects at death.
//
// The data manager is a singleton.
//
/////////////////////////////////////////////////////////////////////////////
 
template <typename T, typename C>
class DataManager
{
protected:
  // Constructor/destructor
  DataManager ();
  virtual ~DataManager ();
 
public:
  // Public interface
  T *request (const string &name);
 
  void registerObject (const string &name, T *object)
    throw (DataManagerException);
  void unregisterObject (const string &name, bool deleteObject = false);
 
  void purge ();
 
private:
  // Member variables
  typedef map<string, T*> DataMap;
  DataMap _registry;
 
public:
  // Singleton related functions
  static C *getInstance ();
  static void kill ();
 
private:
  // The unique instance of this class
  static C *_singleton;
};
 
// Include inline function definitions
#include "DataManager.inl"
 
#endif // __DATAMANAGER_H__
Le DataManager.inl:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/* -*- c++ -*- */
/////////////////////////////////////////////////////////////////////////////
//
// DataManager.inl -- Copyright (c) 2006 David Henry
// last modification: feb. 25, 2006
//
// This code is licenced under the MIT license.
//
// This software is provided "as is" without express or implied
// warranties. You may freely copy and compile this source into
// applications you distribute provided that the copyright text
// below is included in the resulting source code.
//
// Implementation of the data manager.
//
/////////////////////////////////////////////////////////////////////////////
 
#include "DataManager.h"
 
 
/////////////////////////////////////////////////////////////////////////////
//
// class DataManager implementation.
//
/////////////////////////////////////////////////////////////////////////////
 
// Singleton initialization.  At first, there is no object created.
template <typename T, typename C>
C *DataManager<T, C>::_singleton = NULL;
 
// --------------------------------------------------------------------------
// DataManager::DataManager
//
// Constructor.
// --------------------------------------------------------------------------
 
template <typename T, typename C>
inline
DataManager<T, C>::DataManager ()
{
}
 
 
// --------------------------------------------------------------------------
// DataManager::~DataManager
//
// Destructor.  Purge all registred objects.
// --------------------------------------------------------------------------
 
template <typename T, typename C>
inline
DataManager<T, C>::~DataManager ()
{
  purge ();
}
 
 
// --------------------------------------------------------------------------
// DataManager::request
//
// Retrieve an object from the registry.  Return NULL if there if the
// requested object has not been found in the registry.
// --------------------------------------------------------------------------
 
template <typename T, typename C>
inline T *
DataManager<T, C>::request (const string &name)
{
  typename DataMap::iterator itor;
  itor = _registry.find (name);
 
  if (itor != _registry.end ())
    {
      // The object has been found
      return itor->second;
    }
  else
    {
      return NULL;
    }
}
 
 
// --------------------------------------------------------------------------
// DataManager::registerObject
//
// Register an object.  If kOverWrite is set, then it will overwrite
// the already existing object.  If kOverWrite is combined
// with kDelete, then it will also delete the previous object from memory.
// --------------------------------------------------------------------------
 
template <typename T, typename C>
inline void
DataManager<T, C>::registerObject (const string &name, T *object)
  throw (DataManagerException)
{
  std::pair<typename DataMap::iterator, bool> res;
 
  // Register the object as a new entry
  res = _registry.insert (typename DataMap::value_type (name, object));
 
  // Throw an exception if the insertion failed
  if (!res.second)
    throw DataManagerException ("Name collision", name);
}
 
 
// --------------------------------------------------------------------------
// DataManager::unregisterObject
//
// Unregister an object given its name.  If deleteObject is true,
// then it delete the object, otherwise it just remove the object
// from the registry whitout freeing it from memory.
// --------------------------------------------------------------------------
 
template <typename T, typename C>
inline void
DataManager<T, C>::unregisterObject (const string &name, bool deleteObject)
{
  typename DataMap::iterator itor;
  itor = _registry.find (name);
 
  if (itor != _registry.end ())
    {
      if (deleteObject)
	delete itor->second;
 
      _registry.erase (itor);
    }
}
 
 
// --------------------------------------------------------------------------
// DataManager::purge
//
// Destroy all registred objects and clear the registry.
// --------------------------------------------------------------------------
 
template <typename T, typename C>
inline void
DataManager<T, C>::purge ()
{
  // Not exception safe!
  for (typename DataMap::iterator itor = _registry.begin ();
       itor != _registry.end (); ++itor)
    {
      // Destroy object
      delete itor->second;
    }
 
  _registry.clear ();
}
 
 
// --------------------------------------------------------------------------
// DataManager::getInstance
//
// Return a pointer of the unique instance of this class. If there is no
// object build yet, create it.
// NOTE: This is the only way to get access to the data manager since
// constructor is private.
// --------------------------------------------------------------------------
 
template <typename T, typename C>
inline C *
DataManager<T, C>::getInstance ()
{
  if (_singleton == NULL)
    _singleton = new C;
 
  return _singleton;
}
 
 
// --------------------------------------------------------------------------
// DataManager::kill
//
// Destroy the data manager, i.e. delete the unique instance of
// this class.
// NOTE: this function must be called before exiting in order to
// properly destroy all registred objects.
// --------------------------------------------------------------------------
 
template <typename T, typename C>
inline void
DataManager<T, C>::kill ()
{
  delete _singleton;
  _singleton = NULL;
}
L'erreur de compilation (enfait il y en a 4):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
g:\codecpp\md2loader\md2\datamanager.inl(97) : error C2899: typename cannot be used outside a template declaration
        c:\program files\microsoft visual studio\vc98\include\streambuf(103) : while compiling class-template member function 'void __thiscall DataManager<class Texture2D,class Texture2DManager>::registerObject(const class std::basic_string<char,str
uct std::char_traits<char>,class std::allocator<char> > &,class Texture2D *)'
g:\codecpp\md2loader\md2\datamanager.inl(100) : error C2144: syntax error : missing ')' before type 'int'
        c:\program files\microsoft visual studio\vc98\include\streambuf(103) : while compiling class-template member function 'void __thiscall DataManager<class Texture2D,class Texture2DManager>::registerObject(const class std::basic_string<char,str
uct std::char_traits<char>,class std::allocator<char> > &,class Texture2D *)'
g:\codecpp\md2loader\md2\datamanager.inl(100) : error C2661: 'insert' : no overloaded function takes 0 parameters
        c:\program files\microsoft visual studio\vc98\include\streambuf(103) : while compiling class-template member function 'void __thiscall DataManager<class Texture2D,class Texture2DManager>::registerObject(const class std::basic_string<char,str
uct std::char_traits<char>,class std::allocator<char> > &,class Texture2D *)'
g:\codecpp\md2loader\md2\datamanager.inl(100) : error C2059: syntax error : ')'
        c:\program files\microsoft visual studio\vc98\include\streambuf(103) : while compiling class-template member function 'void __thiscall DataManager<class Texture2D,class Texture2DManager>::registerObject(const class std::basic_string<char,str
uct std::char_traits<char>,class std::allocator<char> > &,class Texture2D *)'
Je connais le principe des fonction inline et des template mais je les ai jamais utilisé donc je peux pas jouer de la bonne synataxe du code.

Merci