模板,函数使用错误的构造函数来复制我的对象

templates, function uses wrong constructor to copy my object

我创建了一个 class 模板来初始化一个简单的数组 使用参数包扩展和 class 为我的函数提供了一个复制构造函数,它采用 class 的对象。初始化有效,但是当将对象传递给我的函数时,会调用初始化构造函数而不是复制构造函数。

如何让我的函数使用正确的构造函数 能够按值传递对象?

使用 c++17。

我的 class 看起来如下:

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...}{};
      |   

                                            ^  

/*copy c'tr*/

这不是一个正确的断言。这是一个构造函数模板。复制函数始终是实例化的普通成员,从不 模板成员函数。此外,这个 c'tor 正在按价值进行论证。这是一个没有开始的人,因为按值传递的函数参数是复制初始化的,这需要......一个 copy/move c'tor。复制者的正确签名应该是这个

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

通过引用获取参数(对 const)。您的 c'tor 模板旁边可能存在一个副本 c'tor。所以你可能有来自其他实例化和复制的转换,两者都定义良好。

或者,因为无论如何您都在使用默认实现

constexpr myClass(myClass const& mObj) = default;