Re: Strange thing while using templates
* drop669@gmail.com:
Hi.
I have this piece of code:
=====================================
#include <map>
template <class T> class dict
{
private:
std::map<DWORD, T> m_d;
[ ... ]
void enum_keys_as_dwords (DWORD *out)
{
DWORD *o=out;
for (std::map<DWORD, T>::iterator it=m_d.begin(); it!=m_d.end(); it+
+)
{
*o=it->first;
o++;
};
};
};
=====================================
While compiling this in MinGW, it says:
=====================================
dict:91: error: expected `;' before "it"
=====================================
(line 91 is the line where "for (...)" is located).
I'm really don't know what to do. The problem is probably in using
type T. Where I mistaken?
std::map<DWORD,T>::iterator could in principle be anything, depending on
the type T. So you need to inform the compiler that it's a type. You
do that by adding the word 'typename' in front.
That said, it would be a good idea to use a std::vector instead of a raw
array, and also to make that pure accessor a 'const' member function
(probably 'DWORD' is a Windows API name, but in general, reserve all
uppercase for macros).
Then the function would look like
void get_dwords( std::vector<DWORD>& result ) const
{
typedef typename std::map<DWORD, T>::const_iterator Iterator;
std::vector<DWORD> words;
for( Iterator it = m_d.begin(); it != m_d.end(); ++it )
{
words.push_back( it->first );
}
words.swap( result );
}
Note that this way is in general more exception safe as well, not just
more safe against buffer overflows, null-pointer and other problems
associated with raw arrays and pointers.
You can also provide a convenience wrapper relying on Return Value
Optimization (RVO), which most relevant compilers provide:
std::vector<DWORD> dwords() const
{
std::vector<DWORD> result;
get_dwords( result );
return result;
}
The naming convention employed here is that a command-like function's
name 'get_dwords' says what it does, not how (e.g. enumeration) it does
it, and that a function-like function's name 'dwords' says what result
it delivers. That makes the calling code easier to read and comprehend.
Cheers, & hth.,
- Alf