Re: Templates and const function name resolution
Dimitar wrote:
I have the following class C and the function F:
class C
{
public:
const vector<int>& GetV() const { return m_v; }
private:
vector<int>& GetV() { return m_v; }
vector<int> m_v;
};
template<class T1, class T2>
void F(const typename vector<T1>::iterator& first,
const typename vector<T1>::iterator& last)
{
for (vector<T1>::iterator it = first; it != last; ++it)
{
const vector<T2>& v = it->GetV();
}
}
I am trying to call F as:
...
vector<C> v;
F<C, int>(v.begin(), v.end());
...
But this does not compile (with MS VC++ 7) - the compiler
refuses to find the public GetV() function, instead it finds
the private one.
It finds both. It then uses overload resolution to choose the
best match. In this case, the non-const version. (A non-const
function always beets a const function, if it can be called with
the given arguments).
Finally, having chosen the function, the compiler checks whether
it is accessible. It isn't, so you have an error.
However, if I replace
const vector<T2>& v = it->GetV();
with
const vector<T2>& v = vector<T1>::const_iterator(it)->GetV();
the code compiles.
Yes. Because the non-const function cannot be called, and is
not part of the overload set.
I am wondering why the code as presented above does not
compile and how can I make it compile without introducing
const iterator?
Change the name of one of the functions. It is almost always a
bad idea for functions with the same name to have different
access rights.
--
James Kanze GABI Software
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]