2014-12-02 2 views
2

я определяю класс-оболочку, которая может быть использована в качестве капель замены для полезной нагрузки, используя оператор приведения, однако я столкнулся с проблемой с указателем полезной нагрузки:оператор приведения к указателю

компилятор (г ++ 4.8. 3) жалуется на:

ошибка: базовый операнд '->' имеет не-указательный тип 'wrapper' w-> a = 3;

Неявный оператор-оператор wrapper::operator T& вызывается для всех операций указателя, кроме разыменования, есть ли что-то особенное относительно оператора ->?

struct pl{int a;}; 
struct wrapper{ 
    typedef pl* T; 
    T t; 
    operator T&(){return t;}  
}; 
int main(){ 
    wrapper w; 
    w.t=new pl(); 
    (*w).a=1;//ok 
    w[0].a=2;//ok 
    w->a=3;//does not compile 
    ++w;//ok 
    if(w){}//ok 
} 

Примечание: подобная ошибка с лязгом 3,3

+2

Оператор '->' имеет свою подпись, вы должны предоставить T & operator ->(), чтобы он работал. – erenon

+0

Вам нужно будет передать 'w' функции, ожидающей' pl * '. – juanchopanza

ответ

2

Вы не хватало, чтобы объявить/определить operator->() функцию для вашего класса

struct pl{int a;}; 
struct wrapper{ 
    typedef pl* T; 
    T t; 
    operator T&(){return t;}  
    T& operator->() { return t; } // << implement this function 
}; 

int main(){ 
    wrapper w; 
    w.t=new pl(); 
    (*w).a=1;//ok 
    w[0].a=2;//ok 
    w->a=3;//does not compile 
    ++w;//ok 
    if(w){}//ok 
} 

См LIVE DEMO

Рекомендуем также см. Overloading operator-> in C++

+0

Хотя это решение, оно не отвечает на вопрос о том, почему 'operator T &()' был вызван для всех других случаев, когда нужен указатель, а не для случая 'w-> a = 3;'. –

+0

@RSahu Дайте дополнительный ответ, пожалуйста, если у вас есть один ... –

+0

У меня его нет на данный момент. Я не знаю, сколько нужно копать, чтобы объяснить поведение компилятора. –

Смежные вопросы