2017-11-26 2 views
0

mit einigen Vorlagen Experimentieren und deren Verwendungen:Klassenvorlage Konstruktor mit Parameter Pack geben C3520 Fehler

Ich war auf dieser einfachen Struktur, hier zu arbeiten:

template<typename T, size_t n> // templated but not variadic 
struct myArray { 
    static const size_t SIZE = n; 
    T arr_[SIZE]; 

    myArray() {} // Default Constructor 

    template<class... U>  // Initialization Constructor 
    myArray(U pack...) { // Templated with variadic parameters of 
           // type U = T upto SIZE = n; 
     arr_ = pack...; 
    } 
}; 

Das möchte ich auf diese Weise verwenden oder ähnlich:

int main() { 
    myArray<char, 6> arr1{ 'a', 'b', 'c', 'd', 'e', 'f' }; 
    myArray<int, 4> arr2{ 1, 2, 3, 4 };  

    // Or like this: 
    myArray<char, 6> arr1 = { 'a', 'b', 'c', 'd', 'e', 'f' }; 
    myArray<int, 4> arr2 = { 1, 2, 3, 4 }; 
} 

und Visual Studio 2017RC ich diesen Compiler-Fehler erhalte:

1>------ Build started: Project: PracticeMath, Configuration: Debug Win32 ------ 
1>PracticeMath.cpp 
1>c:\users\skilz80\documents\visual studio 2017\projects\practicemath\practicemath\practicemath.cpp(19): error C3520: 'U': parameter pack must be expanded in this context 
1>c:\users\skilz80\documents\visual studio 2017\projects\practicemath\practicemath\practicemath.cpp(22): note: see reference to class template instantiation 'myArray<T,n>' being compiled 
1>c:\users\skilz80\documents\visual studio 2017\projects\practicemath\practicemath\practicemath.cpp(41): fatal error C1903: unable to recover from previous error(s); stopping compilation 
1>Done building project "PracticeMath.vcxproj" -- FAILED. 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Nicht sicher, was ich hier fehlt oder was ich im Initialisierungskonstruktor machen soll.

Antwort

3

Eine mögliche Art und Weise, dass Konstruktor zu schreiben, sind

template <class ... U> 
myArray(U ... pack) : arr_ { pack... } 
{ } 

Zwei Fehler im Code

(1) die ... ist vor dem Pack Namen in Erklärung; so

myArray (U pack ...) 
// ..............^^^ wrong 

und

myArray (U ... pack) 
// .........^^^ correct 

(2) gibt es eine Menge von Modi einen variadische Pack zu verwenden, aber

arr_ = pack...; 

ist keine richtige.

Die übliche Methode zur Verwendung eines Variadic-Pakets mit einem C-artigen Array besteht in der Initialisierung; das heißt, mit Konstruktor, in der Initialisierungsliste.

So

myArray(U ... pack) : arr_ { pack... } 
// .....................^^^^^^^^^^^^^^^^ 

Aber nehmen Sie in count, dass ein Konstruktor wie dies gefährlich ist, weil es nicht eine Prüfung ist die Anzahl des Elements der Packung in Bezug auf (wenn mehr als SIZE das Verhalten des Programms nicht definiert ist (und dies in der Regel, wird: das Programm stürzt ab) ein siple Weg, um dieses Problem zu vermeiden, fügen Sie ein static_assert() im Körper des Konstrukteurs, so etwas wie

template <class ... U> 
myArray(U ... pack) : arr_ { pack... } 
{ static_assert(sizeof...(U) <= N , "too much values"); } 
+0

Vielen Dank die Syntax für die Arbeit mit variadische.. Typen & Vorlagen ist, wo ich stru war Gingeln. –

Verwandte Themen