1

Тема: С++: Помилка 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 і залишити переміщення ?

Подякували: Yola1

2

Re: С++: Помилка C2535. Передача типу-посилання в/через тип-параметр.

Я так розмію проблема в тому, що з T = int&, Boxed(T const &data) і Boxed(T &&data) перетворюються в Boxed(T & data). 
На рахунок перевірки можна через enable_if та is_reference. Ну і ще як варіант можна обрізати & (тай набіса посилання зберігати правда) через remove_reference.

Подякували: koala, leofun01, Yola3

3 Востаннє редагувалося Yola (12.07.2016 13:48:00)

Re: С++: Помилка C2535. Передача типу-посилання в/через тип-параметр.

Як щодо цього

template <typename U>
Boxed<typename std::decay<U>::type> make_Boxed(U && u)
{
    return Boxed<typename std::decay<U>::type>(std::forward<U>(u));
}

і використання

    int i0 = 1; auto v0 = make_Boxed<int&>(i0);
    int i1 = 1; int &li1 = i1; auto v1 = make_Boxed<int&>(li1);

---

Ха! ні, тоді data інший тип матиме.

Подякували: leofun011