Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;模板复制分配运算符与初始值设定项\u列表不兼容?_C++_Templates_C++11_Initializer List - Fatal编程技术网

C++ 在C++;模板复制分配运算符与初始值设定项\u列表不兼容?

C++ 在C++;模板复制分配运算符与初始值设定项\u列表不兼容?,c++,templates,c++11,initializer-list,C++,Templates,C++11,Initializer List,假设我有这样的代码: #include <initializer_list> class my_class { public: my_class() {} void operator = (const std::initializer_list<int>&) {} // OK template<typename ValueType> void operator = (const ValueType&) {} // F

假设我有这样的代码:

#include <initializer_list>

class my_class
{
public:
    my_class() {}

    void operator = (const std::initializer_list<int>&) {} // OK
    template<typename ValueType> void operator = (const ValueType&) {} // Failed
};

int main(int argc, char* argv[])
{
    my_class instance;
    instance = {1, 2};

    return 0;
}

为什么模板版本与初始值设定项列表不兼容?

因为初始值设定项列表是非推断上下文。从[临时扣除类型]:

非推断上下文为:
-[…]
-关联参数为初始值设定项列表(8.5.4)的函数参数,但 没有指定从初始值设定项列表中扣除的类型(14.8.2.1)。[示例:

因此,在您的具体情况下,您可以执行以下操作:

template <typename T>
void operator=(std::initializer_list<T> ) { }
模板
void运算符=(std::初始值设定项\u列表){}
或:

模板
void运算符=(T常量(&)[N]){

尽管后者显然不能在clang上编译,但编译错误。

将模板版本更改为

template <typename ValueType>
void operator =(const std::initializer_list<ValueType> &) {}
模板
void运算符=(常量std::初始值设定项\u列表&){

顺便说一句,这可能不是您想要指定
运算符=
的方式。定义void运算符=(const initializer\u list&somevariable),这样它将遵循int的每个值的模板版本。后者通过const引用传递类型为T的数组?
template<class T> void f(std::initializer_list<T>);
f({1,2,3}); // T deduced to int

template<class T, int N> void h(T const(&)[N]);
h({1,2,3}); // T deduced to int, N deduced to 3

template<class T> void j(T const(&)[3]);
j({42}); // T deduced to int, array bound not considered
template <typename T>
void operator=(std::initializer_list<T> ) { }
template <typename T, size_t N>
void operator=(T const(&)[N]) { }
template <typename ValueType>
void operator =(const std::initializer_list<ValueType> &) {}