шаблоны, функция использует неправильный конструктор для копирования моего объекта - PullRequest
0 голосов
/ 16 февраля 2020

Я создал шаблон класса, который инициализирует простой массив, используя расширение пакета параметров, и у класса есть конструктор копирования для моей функции, который принимает объект этого класса. Инициализация работает, но при передаче объекта в мою функцию вызывается конструктор инициализации, а не конструктор копирования.

Как я могу заставить мою функцию использовать правильный конструктор, чтобы иметь возможность передавать объект по значению?

Работа с c ++ 17.

Мой класс выглядит следующим образом:

template<typename I, std::size_t val>
class myClass{

    public:
        std::array<I, val> data;

    template<typename ...T>
    constexpr myClass(T&& ... elem) : data{elem...}{};

    /*copy c'tr*/
    template<typename T, std::size_t value>
    constexpr myClass(myClass<T, value> mObj){
        data = mObj.data;
    }
};

struct myStruct{
    myClass<int, 5> aC{1,2,3,4,5};
};

template<typename I, std::size_t val>
constexpr auto myfunction(myClass<T, val> obj){
    int a = obj.data[0];
    return a;
}

Это мой основной:

int main() {
    myStruct myStructObj;
    auto myvalue = myfunction(myStructObj.aC);
    return 0;
} 

В конце , мое сообщение об ошибке:

tensor.h: In instantiation of ‘constexpr myClass<I, val>::myClass(T&& ...) [with T = {myClass<int, 5>&}; I = int; long unsigned int val = 5]’:
main.cpp:72:30:   required from here
tensor.h:188:51: error: cannot convert ‘myClass<int, 5>’ to ‘int’ in initialization
  188 |     constexpr myClass(T&& ... elem) : data{elem...}{};
      |   

                                            ^  

1 Ответ

3 голосов
/ 16 февраля 2020

/*copy c'tr*/

Это неверное утверждение. Это шаблон конструктора. Копия c 'tor всегда является нормальным членом экземпляра, никогда не является функцией-членом шаблона. Кроме того, этот c 'tor принимает свой аргумент по значению. Это не начало, так как аргументы функции, которые передаются по значению, инициализируются копией, что требует ... копирования / перемещения c 'tor. Правильная подпись для копии c 'будет такой:

constexpr myClass(myClass const& mObj){
    data = mObj.data;
}

Возьмите аргумент по ссылке (для констант). Копия c 'может существовать рядом с вашим шаблоном c'. Таким образом, у вас могут быть преобразования из других экземпляров и копий, которые хорошо определены.

Или, поскольку вы все равно после реализации по умолчанию

constexpr myClass(myClass const& mObj) = default;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...