использование явного с шаблонами, переполнение стека

У меня есть вопрос о явных и шаблонах:

template<class T>
class A {

class A_Impl {
T var;

public:
explicit A_Impl(T var1) : var(var1), version(1)
{
}

A_Impl(const A_Impl& a ) : var(a.var), version(1)
{
}

const A_Impl& operator=(const A_Impl& a)
{
var=a.var;++version;return *this;
}

operator T() const { return var; }

friend class A<T>;
};

A_Impl a;

public:
A(T var): a(var)
{
}

A_Impl& get() { return a; }
};

void main() {
A<int> a1(5);
cout<<"a1 = "<<a1.get()<<endl;

a1.get()=7;
cout<<"a1 = "<<a1.get()<<endl;

a1=13;
cout<<"a1 = "<<a1.get()<<endl;
}

Я получаю ошибку в a1.get()=7; который говорит, что нет оператора «=» соответствует этим операндам

Кроме того, если я возьму явное слово, оно будет скомпилировано, но я не понимаю разницу между a1.get() функция и a1=13; который отлично работает даже с явным.

0

Решение

Я получаю ошибку при a1.get () = 7; который говорит, что нет оператора «=» соответствует этим операндам

Там нет способа конвертировать 7 к A_Impl за operator=потому что конструктор A_Impl(T), который в этом случае расширяется до A_Impl(int), объявлен explicit,

Вы можете удалить explicit ключевое слово или явно создать A_Impl с:

a1.get() = A_Impl(7);

В качестве альтернативы вы также можете объявить operator=:

const A_Impl& operator=(const T&)

для A_Impl учебный класс.


Кроме того, если я возьму явное слово, оно будет скомпилировано, но я не понимаю разницу между функцией a1.get () и a1 = 13; который отлично работает даже с явным.

a1 = 13 работает нормально, потому что шаблон класса A имеет без явного конструктор для T (в частности, A(T var)), который в данном случае идеально подходит для T = int,


Также обратите внимание, что main должен всегда возвращаться intне void,

1

Другие решения

Вы только что объявили оператор присваивания копии: const A_Impl& operator=(const A_Impl& a),
но не оператор присваивания для T типы: const A_Impl& operator=(const T& a),

Если у вас нет explicit конструктор, ваш int (7) будет преобразован в A_Impl объект, который затем присваивается вашей возвращенной ссылке.

Если ваш конструктор explicit это преобразование орудия больше невозможно (вот что explicit на самом деле), и, следовательно, нет возможности назначить int к A_Impl,
Что, однако, будет работать, если ваш A_Impl Это общедоступный класс (это то же самое, что происходит под капотом, если вы не пишете explicit):

a1.get() = A_Impl(7);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector