template functions overload
От: Аноним  
Дата: 28.11.05 13:10
Оценка:
Привет!

У меня есть проблема... не могу заставить компилятор мыслить так, как того хочу я...
По поводу перегрузки возвращаемых типов прочитал, что это невозможно. Вычитал только, что можно заставить его различить const и non-const функции (ссылка — http://cpptips.hyperformix.com/cpptips/const_overl).. Но вот не получается все равно у меня заставить его понять, какая функция конст, а какая нет. Идентичное дело наблюдал у STL'вского bit_vector'a (ссылка — http://www.sgi.com/tech/stl/stl_bvector.h). Тут все работает нормально.. есть 2 begin()'a , которые возвращают то, что нужно программисту... конст либо нет... Хочу заставить следующий код сделать то же самое, но пока безрезультатно... Help needed:

#include <bitset>
#include <vector>
#include <iostream>

template<typename _TYPE> class iter {
public:
int b;
iter() {};
iter(int _v) : b(_v) {}
~iter() {};
void show() { std::cout<<b<<std::endl; }
iter operator = (iter x) { std::cout<<"1"<<std::endl; b=1; }
};

template<typename _TYPE> class const_iter {
public:
typedef const _TYPE __t;
const int b;
const_iter() : b() {};
const_iter(const int _v) : b(_v) {};
const_iter(const const_iter& _v) : b(_v.b) {};
const_iter(const_iter& _v) {};
void lol () const {}
// ~const_iter() {};
void show() const { std::cout<<b<<std::endl; }
const const_iter operator = (const const_iter x) const { std::cout<<"2"<<std::endl; }
};

template<typename _TYPE> class ulman {
public:
typedef iter<_TYPE> _iter;
typedef const const_iter<_TYPE> _const_iter;
ulman() {};
~ulman() {};
_iter begin() { return _iter(1); };
_const_iter begin() const { return _const_iter(2); };

};

int main(int argc, char **argv) {

ulman<int> u;
iter<int> it = u.begin();
const const_iter<int> c_it = u.begin(); <---- ругается, т.к. возвращает iter, вместо const_iter'a
it.show(); c_it.show();
}

Может кто-нибудь знает как заставить его работать так же гладко, как и у bit_vector'a... Компилировал на gnu'шном компиляторе под линуксом (g++ (GCC) 3.2.2).

Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.