LINUX.ORG.RU

Как правильно в C++ вызвать нужную функцию?


0

0

Вот: одна функция const - и она публик, вторая не const и она приват, как из main'а правильно
вызнать публичную const функцию?
(progs]$ g++ --version: g++ (GCC) 3.3.2 (Mandrake Linux 10.0 3.3.2-6mdk)


#include <vector>
using namespace std;

class A{
private:
vector<int> intvector;
public:
A() {intvector.insert(intvector.begin(),10,10);}
A(const vector<int> & v):intvector(v){;}

const vector<int>& vecref() const {return intvector;}
private:
vector<int>& vecref() {return intvector;}
};

int main(int argc, char *argv[])
{
A a;
for (vector<int>::const_iterator i=a.vecref().begin();i!=a.vecref().end();++i){
;//do something
}
return 0;
}
z.cpp:13: error: `std::vector<int, std::allocator<int> >& A::vecref()' is private
z.cpp:19: error: within this context
z.cpp:13: error: `std::vector<int, std::allocator<int> >& A::vecref()' is private
z.cpp:19: error: within this context

anonymous

Твоя проблема в том, что ты сначала определяешь первую вункцию как public, потом её же как private - с точки зрения сигнатур они абсолютно одинаковы (аргументы идентичны) - а по возвращаемому результату перегрузки нет.

Т.е. твоё объявление в private затирает объявление в public.

Выход - сделай разные названия.

Spectr ★★★
()
Ответ на: комментарий от Spectr

1. если память не изменяет, то const после названия функции должен изменять "сигнатуру".
как факт - если обе функции public, то все работает нормально и всегда вызываются правильные
функции (хотя может быть, что они распознаются в run time).

2. менять имя функции никак (абсолютно никак) низяяяяя

anonymous
()
Ответ на: комментарий от anonymous

да, сигнатуры разные, но компилятор почему-то все равно хочет вызвать не-константную функцию...

Spectr ★★★
()
Ответ на: комментарий от anonymous

у тебя объект должен быть константным. можешь явный каст сделать:

((A const *)&obj)->vecref(...)

dilmah ★★★★★
()

Как я это понимаю: с++ пробует вначале некостантную версию( и причем она проходит: .begin() применима к неконстантной ссылке и может вернуть const_iterator ). На этом c++ останавливается, потом проверяет имеет ли право вызывающий вызвать этот метод. Но он не может( из-за private ). Но c++ уже не пытается дальше продолжить поиск подходящей сигнатуры. Как правильно уже сказали, нужно преобразовать объект к константному. Еще один выход - сделать так чтобы класс сам умел возвращать итераторы:

vector<int>::const_iterator vec_begin() const {return intvector.begin();} private: vector<int>::iterator vec_begin() {return intvector.begin();}

И все будет ОК :)

anonymous
()

Помоему это можно считать багой gcc - отпиши им, а для того чтоб работало можно сделать так:
#include <vector>
using namespace std;

class A{
private:
vector<int> intvector;
public:
A() {intvector.insert(intvector.begin(),10,10);}
A(const vector<int> & v):intvector(v){;}

const vector<int>& vecref() const {return intvector;}
private:
vector<int>& vecref() {return intvector;}
};

int main(int argc, char *argv[])
{
A a;
const A& a1 = a;
for (vector<int>::const_iterator i=a1.vecref().begin();i!=a1.vecref().end();++i){
;//do something
}
return 0;
}

zaz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.