模板函数中的多个参数包无法编译

时间:2018-07-13 00:04:53

标签: c++11 visual-c++

以下代码具有模板化运算符==,该运算符具有两个连续的非类型参数包。尝试使用MSVS 2017 17.7.5进行编译。我知道编译器无法推断出第一个包中的参数时的问题。但是,我认为,在确定Adapter0和Adapter1的列表时,operator ==的签名将导致编译器“做正确的事”。我对C ++ {11/14/17}的了解不足,无法理解为什么它不起作用。任何线索都欢迎。我相信我的代码的意图很明确,因此,如果我可以使用另一种范例来实现自己的目标,我将不胜感激。

#include <array>

template <typename T, size_t... Arguments> class MyClass {};
constexpr size_t ADAPTER = static_cast<size_t>(-1);

template <typename T, size_t N>
class MyClass<T, N>
{
public:
    MyClass() {}
    T const& operator[] (size_t i) const { return mElements[i]; }
    T& operator[] (size_t i) { return mElements[i]; }
    std::array<T, N> mElements;
};

template <typename T, size_t N>
class MyClass<T, N, ADAPTER>
{
public:
    MyClass(T* elements) : mElements(elements) {}
    T const& operator[] (size_t i) const { return mElements[i]; }
    T& operator[] (size_t i) { return mElements[i]; }
    T* mElements;
};

template <typename T, size_t N, size_t... Adapters0, size_t... Adapters1>
bool operator==(MyClass<T, N, Adapters0...> const& v0, MyClass<T, N, Adapters1...> const& v1)
{
    for (size_t i = 0; i < N; ++i) { if (v0[i] != v1[i]) { return false; } } return true;
}

// This code compiles.
template class MyClass<float, 2>;
template class MyClass<float, 2, ADAPTER>;
template bool operator==(MyClass<float, 2> const&, MyClass<float, 2> const&);

// This code does not compile.  (The size_t cast of -1 is 18446744073709551615.)
template bool operator==(MyClass<float, 2> const&, MyClass<float, 2, ADAPTER> const&);
// error C2893 : Failed to specialize function template 'bool operator ==(const MyClass<T,N,Adapters0...> &,const MyClass<T,N,Adapters1...> &)'
// note: With the following template arguments :
// note: 'T=float'
// note: 'N=2'
// note: 'Adapters0={2, 18446744073709551615}'
// note: 'Adapters1={18446744073709551615}'

顺便说一句,我注意到Adapters0和Adapters1似乎是“反向的”,因此我将operator ==声明改为了使用

template <typename T, size_t N, size_t... Adapters1, size_t... Adapters0>

这个编译的文件,这让我感到困惑。

0 个答案:

没有答案