我有一個類可以根據單個大小參數進行模板化。我想要一個構造函數,它接受基於模板大小參數的可變金額std::array
。所以如果課堂模板化爲一個。它應該接受一個數組。如果模板兩個應該接受兩個等基於模板參數的模板類強制參數數
這是我想出了,但顯然它不工作:
template<std::size_t V>
class Test
{
public:
/* Constructors. */
Test() {}
template <std::array<int, 3> ...Args, typename = typename std::enable_if<V == sizeof...(Args), void>::type>
Test(std::array<int, 3>&&... args)
{
}
};
int main()
{
auto t = Test<1>({ 1, 2, 3 });
auto t2 = Test<2>(
{ 1, 2, 3 },
{ 4, 5, 6 }
);
}
我收到的錯誤是:
error C2993: 'std::array<int,3>': illegal type for non-type template parameter 'Args'
note: see reference to class template instantiation 'Test<V>' being compiled
error C3543: 'std::array<int,3> &&': does not contain a parameter pack
error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'Test<1>'
note: No constructor could take the source type, or constructor overload resolution was ambiguous
error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'Test<2>'
note: No constructor could take the source type, or constructor overload resolution was ambiguous
任何幫助表示讚賞。
如何移動'V = = ..的sizeof 。(Args)'方法裏面的'static_assert'?實際上它應該是'template',你還需要檢查每個參數的類型。 –
VTT
@VTT我得到幾乎相同的錯誤。我已經在問題中發佈了它! –
@VTT函數內部的'static_assert'比正確的模板元編程會產生一個錯誤,所以如果存在多個構造函數,可能會導致一些問題(例如)選擇了無效的重載。 –