Шаблоны C ++: Byval / Reference мешают друг другу - PullRequest
0 голосов
/ 28 мая 2011

Вот упрощенная версия моей проблемы. У меня есть класс недвижимости. У него есть такие данные, как has_initalized и такие, которые я удалил для этого примера.

Когда я вызываю функцию, которая использует T, это нормально. Однако T & isnt, поэтому я решил написать T & версию этого. Но это вызывает все функции, которые используют обычный T, чтобы получить ошибку компиляции. Почему T & мешает этому? В этом примере, как заставить обе функции (Q и W) работать без изменения main ()?

template <class T>
class Property {
    T v;
    Property(Property&p) { }
public:
    Property() {}
    T operator=(T src) { v = src; return v; }
    operator T() const { return v; }
    operator T&() const{ return v; }
    T operator->() { return v; }
};

class A{};

void Q(A  s){}
void W(A& s){}

int main(){
    Property<A> a;
    Q(a);
    W(a);
}

Ответы [ 2 ]

4 голосов
/ 28 мая 2011

В правилах перегрузки C ++ нет ничего, что позволяло бы компилятору выбирать между operatorT() и operatorT&() при вызове Q. Так что удаление

operator T() const { return v; }

также удалит неоднозначность. Но тогда у вас возникнет проблема, поскольку возврат неконстантной ссылки на член в константной функции невозможен.

1 голос
/ 28 мая 2011

Для вашего Q вы можете использовать обе функции преобразования.Вы можете сделать так, чтобы компилятор предпочел один другому, сделав один неконстантным.

operator T() const { return v; }
operator T&() { return v; }

Теперь для Q берется operator T&.Этот способ также исправит вызов на W, чтобы получить неконстантную ссылку.Вы также можете вернуть константную ссылку из другого

operator T const&() const { return v; }
operator T&() { return v; }

Таким образом, вы все равно предпочтете вторую функцию преобразования для Q, но если ваш объект a является константным и вы инициализируете константную ссылку, выне всегда требуется копировать v.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...