Re: enforcing const overload of a method
Rem wrote:
Please take a look at this code:
class A
{
public:
template<class XIter>
A(const XIter begin, const XIter beyond)
{}
};
#include <vector>
int main(int argc, char* argv[])
{
std::vector<int> integers;
A a1( integers.begin(), integers.end() );//No problem
std::vector<int>::const_iterator i( ++( integers.begin() ) );//
compiler doesn't like const_iterator here
A a2( i, integers.end() );//error C2660: 'A::A' : function does not
take 2 arguments
return 0;
}
What happened here is that in a2 constructor call Visual C++ 2008
was unable to choose the const version of std::vector<T>::end() -
or so I guess. The error message is very confusing.
Do you know how I can make sure that the const_iterator is picked
as a template argument instead of iterator?
Right now, you have to call end() on a const vector to get a
const_iterator. You could possibly make 'integers' const, or form a
const reference to it:
const std:vector<int>& const_integer = integer;
A a2(i, const_integer.end();
In C++0x (and Visual C++ 2010) the standard containers also have
cbegin() and cend() members, that always return const_iterators. Help
is on its way!
Bo Persson
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]