This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
RE: using the member types of a parameter class in a template function
- From: lrtaylor at micron dot com
- To: <steven dot keuchel at freenet dot de>, <gcc-help at gcc dot gnu dot org>
- Date: Thu, 18 Sep 2003 13:08:05 -0600
- Subject: RE: using the member types of a parameter class in a template function
Hello,
I believe your code should be like this:
01: #include <vector>
02:
03: template<class CONT> void templfunc(const CONT& mycont)
04: {
05: typename CONT::iterator myiter; // and now do sth with it
06: }
07:
08: int main(int argc, char **argv)
09: {
10: std::vector<int> myvec;
11: templfunc(myvec);
12:
13: return 0;
14: }
Note that I have added "typename" to line 5. I believe that using "typename" here adheres to the ANSI standard. It just may be that MS has decided to make it optional in their compiler. This compiles with GCC 3.3.1. I suspect it will with 3.2.3 as well, but I can't test that.
In addition, you will probably want/need to use a const_iterator rather than an iterator since you're passing in a const reference as your parameter...
Thanks,
Lyle Taylor
-----Original Message-----
From: Steven Keuchel [mailto:steven.keuchel@freenet.de]
Sent: Thursday, September 18, 2003 2:36 PM
To: gcc-help@gcc.gnu.org
Subject: using the member types of a parameter class in a template function
Hi list,
i'm posting to this list instead of comp.lang.c++ because the following code
compiles with M$VC 7.0 but not with GCC.
I want to write a function that gets an arbitrary container and iterates
through it. I can access the member funcs of the passed object and even
static member functions of the parameter class (if it has some) but not
member types of the class.
01: #include <vector>
02:
03: template<class CONT> void templfunc(const CONT& mycont)
04: {
05: CONT::iterator myiter; // and now do sth with it
06: }
07:
08: int main(int argc, char **argv)
09: {
10: std::vector<int> myvec;
11: templfunc(myvec);
12:
13: return 0;
14: }
I know that i can implement this function by passing the range using 2
iterators, which would be better code, but that's not the solution i search
for.
gcc 3.2.3 says:
main.cpp:5: syntax error before `;' token
gcc 3.4 (20030910) says:
main.cpp: In function `void templfunc(const CONT&)':
main.cpp:5: error: expected `;'
main.cpp: In function `void templfunc(const CONT&) [with CONT =
std::vector<int, std::allocator<int> >]':
main.cpp:11: instantiated from here
main.cpp:5: error: `CONT::iterator' names a type, but a non-type is expected
Is this a GCC bug or is my code faulty and there's yet another bug in M$VC ?
Best regards,
Steven.
PS.: please CC me, as i'm not subscribed to the list, thx