以下代码具有模板化运算符==,该运算符具有两个连续的非类型参数包。尝试使用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>
这个编译的文件,这让我感到困惑。