Тема: С++: Помилка C2535. Передача типу-посилання в/через тип-параметр.
Є код:
template<typename T>
struct Boxed
{
private: T data;
public:
virtual T const GetData() const { return data; }
virtual void SetData(T const data) { this->data = data; }
virtual void MoveData(T &&data) { this->data = std::move(data); }
Boxed() : data() { }
Boxed(T const &data) : data(data) { }
Boxed(Boxed<T> const &lvalue) : data(lvalue.data) { }
Boxed(T &&data) : data(std::move(data)) { }
Boxed(Boxed<T> &&rvalue) : data(std::move(rvalue.data)) { }
};
void main()
{
// int i0 = 1; Boxed<int &> v0(i0); // VC[2013, 2010](Error: C2535).
// int i1 = 1; int &li1 = i1; Boxed<int &> v1(li1); // Error: VC[2013, 2010](Error: C2535).
Boxed<int> v2(1); // Ok.
int i3 = 1; Boxed<int> v3(i3); // Ok.
int i4 = 1; int &li4 = i4; Boxed<int> v4(li4); // Ok.
Boxed<int> v6(std::move(1)); // VC[2013, 2010] Ok.
int i8 = 1; Boxed<int> v8(std::move(i8)); // VC[2013, 2010] Ok.
int i10 = 1; int &li10 = i10; Boxed<int> v10(std::move(li10)); // VC[2013, 2010] Ok.
// Boxed<int &&> v5(1); // VC[2013] Ok.
// Boxed<int &&> v7(std::move(1)); // VC[2013] Ok.
// int i9 = 1; Boxed<int &&> v9(std::move(i9)); // VC[2013] Ok.
// int i11 = 1; int &li11 = i11; Boxed<int &&> v11(std::move(li11)); // VC[2013] Ok.
}
Нормально компілюється. Але якщо розкоментувати котрийсь із перших двох рядків в функції main(), то пише (1 помилка):
Error C2535: Boxed<T>::Boxed(T) функція-член вже визначена або об'явлена.
Error C2535: Boxed<T>::Boxed(T) member function already defined or declared.
Чи є якийсь спосіб перевірити, чи переданий в шаблон тип є звичайним (T = int), чи посиланням (T = int &, T = int &&).
int - це для прикладу. Загалом туди мають іти різні типи.
Чи може є якийсь інший спосіб позбутись помилки C2535 і залишити переміщення ?