views:

96

answers:

2

Possible Duplicate:
Why do I need to use typedef typename in g++ but not VS?

Hi, recently I accounted with a "simple problem" of porting code from VC++ to gcc/intel. The code is compiles w/o error on VC++:

#include <vector>
using std::vector;

template <class T> 
void test_vec( std::vector<T> &vec) 
{ 
        typedef std::vector<T> M; 
/*==> add here  typename*/  M::iterator  ib=vec.begin(),ie=vec.end();
};
int main()
{
     vector<double> x(100, 10);
     test_vec<double>(x); 
     return 0;
}

then with g++ we have some unclear errors:

 g++ t.cpp
t.cpp: In function 'void test_vec(std::vector<T, std::allocator<_CharT> >&)':
t.cpp:13: error: expected `;' before 'ie'
t.cpp: In function 'void test_vec(std::vector<T, std::allocator<_CharT> >&) [with T = double]':
t.cpp:18:   instantiated from here
t.cpp:12: error: dependent-name 'std::M::iterator' is parsed as a non-type, but instantiation yields a type
t.cpp:12: note: say 'typename std::M::iterator' if a type is meant

If we add typename before iterator the code will compile w/o pb.

If it is possible to make a compiler which can understand the code written in the more "natural way", then for me is unclear why we should add typename? Which rules of "C++ standards"(if there are some) will be broken if we allow all compilers to use without "typename"?

kind regards Arman.

+1  A: 

Here is a page that explains typename.

Ignacio Vazquez-Abrams
That what I was looking for, thanks.
Arman
You should write a summary of it here, so that 1) we have a reason to upvote the answer, and 2) so the answer stays useful even if the page you linked to is down.
jalf
+1  A: 

http://msdn.microsoft.com/en-us/library/8y88s595(VS.71).aspx

This will help you..