Re: compilation error related to template parameter
subramanian100in@yahoo.com wrote:
Consider the following program:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
template<class T> class Vec : public vector<T>
{
public:
Vec() : vector<T>() { }
Vec(int s) : vector<T>(s) { }
T& operator[] (int i) { return at(i); }
};
int main()
{
Vec<string> s(3);
return 0;
}
Suppose this program is named as y.cpp
When this program is compiled under Redhat Enterprise Linux
Workstation, as
g++ -std=c++98 -pedantic -Wall -Wextra y.cpp
I am getting the following compilation error:
y.cpp: In member function `T& Vec<T>::operator[](int)':
y.cpp:14: error: there are no arguments to `at' that depend on a
template parameter, so a declaration of `at' must be available
However under VC++ Express Edition 2005, it compiles well without any
warning or error.
Kindly explain what is wrong with the above program and help me in
fixing the compilation error with g++ under Linux
My newsserver is slow today, so I may be replying to something that
has already been discussed, sorry for that.
In your case 'at' is a dependent name. You need to help the compiler
to find it by pointing it to the member function. There are two ways
to do that, a 'using' declaration and an explicit qualification of
the name. So, either do
template<class T> class Vec : public vector<T>
{
using vector<T>::at;
public:
Vec() : vector<T>() { }
Vec(int s) : vector<T>(s) { }
T& operator[] (int i) { return at(i); }
};
or
template<class T> class Vec : public vector<T>
{
using vector<T>::at;
public:
Vec() : vector<T>() { }
Vec(int s) : vector<T>(s) { }
T& operator[] (int i) { return this->at(i); }
// or
// T& operator[] (int i) { return vector<T>->at(i); }
};
Next time read the FAQ first.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask