MSVC 2015 SFINAE未能找到合适的会员功能

时间:2016-02-07 21:24:41

标签: c++ visual-c++

使用MSVC 2015,我有一些基本代码如下:

class Setter {
public:
    void set(int value) {}
    template <int Size> void set(int value[Size]) {}
};

看起来并不重要,所以我把它们留空了。但是,如果我尝试使用set的数组版本,如下所示:

int data[128];
Setter setter;
setter.set(data);

我收到以下编译时错误:

error C2664 : 'void Setter::set(int)' : cannot convert argument 1 from 'int [128]' to 'int'

根据SFINAE的规则,是否存在一个成员函数,其签名与Setter类完全匹配?似乎模板set应与template<> void Setter::set(int value[128]) {}中可以推导出的某些内容相匹配。是否有一些规则禁止此代码在标准中编译,或者MSVC是否做错了什么?谢谢!

修改

真的,我需要一个解决方案。因此,如果有人不能指出我在标准中的答案,但知道一个解决方法,我很容易接受。

1 个答案:

答案 0 :(得分:1)

解决方案:

 template <int Size> void set(int (&value)[Size]) {}

你不能按值传递一个简单的int数组,你应该这样做(通过ref)。

如果要按值传递数组,请考虑使用std :: array