VS 2005 Error - Error: see reference to class template instantiation
I have ported my application to VS 2005, and my VS 2005 gives a
compiler error related to some templates.
Error is
Fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'msc1.cpp', line 1392)
1> To work around this problem, try simplifying or changing the program
near the locations listed above.
1>Please choose the Technical Support command on the Visual C++
1> Help menu, or open the Technical Support help file for more
information
1>
d:\Perforce\depot\DNA\Src\AllPlatforms\include\Collections.h(650) : see
reference to class template instantiation
'CMultiMap<Key,Value,Compare>' being compiled
Here is CMultiMap defined in collections.h
template <class Key, class Value, class Compare = std::less <Key> >
class CMultiMap : public std::multimap<Key, Value, Compare >
{
public:
typedef typename CMultiMap<Key, Value, Compare>::iterator iterator;
typedef std::pair<iterator, iterator> PairIterator;
protected:
BOOL GetNextElementInternalForKey(PairIterator& iterPair, const Key&
key, Value& val)
{
iterator iteratorStart = iterPair.first;
iterator iteratorEnd = iterPair.second;
if ((iteratorStart == end()))
return FALSE;
if(iteratorStart == iteratorEnd)
return FALSE;
val = (*iteratorStart).second;
OnLookup(key, val);
++(iterPair.first);
return TRUE;
}
BOOL GetNextElementInternal(iterator& iter, Key& key, Value& val)
{
if (iter == end())
return FALSE;
key = (*iter).first;
val = (*iter).second;
OnLookup(key, val);
++iter;
return TRUE;
}
public:
typedef typename CMultiMap<Key, Value, Compare>::iterator iterator;
CMultiMap()
{
}
~CMultiMap()
{
}
void SetAt(const Key& key, const Value val)
{
insert(std::pair<Key, Value>(key, (val)));
}
BOOL Lookup(const Key& key, Value& val)
{
BOOL bRet = FALSE;
iterator iter = find(key);
if (iter != end())
{
val = (*iter).second;
bRet = TRUE;
}
return bRet;
}
BOOL Lookup(const Key& key, iterator& iter)
{
BOOL bRet = FALSE;
iter = find(key);
if (iter != end())
{
bRet = TRUE;
}
return bRet;
}
BOOL Exists(const Key& key)
{
iterator iter = find(key);
return (iter != end());
}
BOOL DeleteAt(const Key& key)
{
return erase(key);
}
BOOL DeleteAt(const iterator& iter)
{
return erase(iter);
}
void GetValueAt(const iterator& iter, Value& val)
{
val = (*iter).second;
}
size_type Size() const
{
return CMultiMap<Key, Value, Compare>::size();
}
void Clear()
{
CMultiMap<Key, Value, Compare>::clear();
}
virtual void OnLookup(const Key& key, Value& val)
{
// Do nothing in the default implementation
}
BOOL GetFirstElementForKey(PairIterator& iter, const Key& key, Value&
val)
{
iter = equal_range(key);
BOOL bRetVal = GetNextElementInternalForKey(iter, key, val);
return bRetVal;
}
BOOL GetNextElementForKey(PairIterator& iter, const Key& key, Value&
val)
{
BOOL bRetVal = GetNextElementInternalForKey(iter, key, val);
return bRetVal;
}
BOOL GetFirstElement(iterator& iter, Key& key, Value& val)
{
iter = begin();
BOOL bRet = GetNextElementInternal(iter, key, val);
return bRet;
}
BOOL GetNextElement(iterator& iter, Key& key, Value& val)
{
BOOL bRet = GetNextElementInternal(iter, key, val);
return bRet;
}
// Deletes all entries that match key and val. Requires == operator
for val.
BOOL DeleteEntry(Key & key, Value & val)
{
iterator lbIter = lower_bound(key);
iterator upIter = upper_bound(key);
iterator iter;
BOOL bRet = FALSE;
for (iter = lbIter; iter != upIter; )
{
Value entryVal = (*iter).second;
if (entryVal == val)
{
iter = erase(iter);
bRet = TRUE;
}
else
{
iter++;
}
}
return TRUE;
}
};