Zur Kompilierzeit bekanntes C-Array einem constexpr Konstruktor übergeben.



  • Hallo,

    ich möchte gerne ein Multidimensionales C-Array einem constexpr Konstruktor übergeben. Dabei handelt es sich um Daten die bekannt sind und sich während der Laufzeit auch nicht ändern sollen.

    class TestArray {
    public:
    	const unsigned int a[][2];
    public:
    	constexpr TestArray(const unsigned int a[][2]) : a{a} {}
    };
    
    class TestArrays {
    public:
    	static constexpr TestArray test = TestArray({{11,12},{21,22}});
    	static constexpr TestArray test2 = TestArray({{11,12},{21,22},{31,32}});
    public:
    	TestArrays() {}
    };
    
    int main() {
    	TestArrays::test;
    }
    

    Leider lässt sich mein Beispiel nicht Kompilieren und ich verstehe es nicht warum.

    Fehlermeldungen:

    TestArray.cpp:5:54: error: too many initializers for 'const unsigned int [0][2]'
    TestArray.cpp:10:63: error: no matching function for call to 'TestArray::TestArray(<brace-enclosed initializer list>)'
    TestArray.cpp:11:72: error: no matching function for call to 'TestArray::TestArray(<brace-enclosed initializer list>)'

    Wie kann ich das C-Array richtig initialisieren?



  • Gibt es einen Grund für eine eigene Klasse? Sonst kannst du std::array nehmen, etwa:

    #include<iostream>
    #include<array>
    using namespace std;
    
    int main() {
    constexpr array<array<int, 3>, 2> arr {{ 
                                    {{1, 2, 3}},
                                    {{4, 5, 6}} 
                                 }};
    
     cout << arr[0][1] << '\n';
    }
    


  • constexpr schrieb:

    Gibt es einen Grund für eine eigene Klasse?

    Ja da hier noch einige Parameter hinzukommen. Mit diesen Parametern möchte ich auch verschiedene Werte beim kompilieren Berechnen lassen und diese mittels constexpr Methoden zur Verfügung stellen.

    Aber der Hinweis mit std::array ist vielleicht ganz gut für mein Problem.
    Werde ich gleich mal testen.

    Danke!



  • Hmm...

    Irgendwie komme ich mit std::array auch nicht weiter. Hier endet dies in dem selben Fehler wie oben.

    Vielleicht bin ich da auch auf dem falschen Pfad und muss meine Frage anders stellen:

    Wie kann ich eine Klasse erstellen die einen constexpr Konstruktor besitzt (um zur Kompilierzeit Werte zu berechnen) bei dem ein Mehrdimensionales Array (vorzugsweise variabler Wert x 2) übergeben werden kann?



  • Ich habe es jetzt mit einem Template versucht.
    Eindimensional funktioniert es. Bei mehrdimensionalem Array funktioniert es leider nicht.

    #include<array>
    using namespace std;
    
    template<unsigned int dim>
    class TestArray {
    public:
    	const array<array<unsigned int, dim>, 2> a;
    
    public:
    	constexpr TestArray(const array<array<unsigned int, dim>, 2> & a ) : a(a) {}
    };
    
    int main() {
    	constexpr TestArray<1> testArray1({11,12});
    	constexpr TestArray<2> testArray2({{11,12},{21,22}}); // error: no matching function for call to 'TestArray<2u>::TestArray(<brace-enclosed initializer list>)'
    }
    

    Kann es sein, dass der Compiler den Aktualparameter für das Array als getrennte Aktualparameter für den Konstruktor nimmt / interpretieren will?



  • Ein array ist ein sog. Aggregat. Du musst ein paar extra Klammern spendieren.

    constexpr TestArray<2> testArray2 ({{ {{11,12}},{{21,22}} }});
    


  • constexpr schrieb:

    Ein array ist ein sog. Aggregat.

    Aja wieder was dazugelernt. 🙂

    Vielen Dank für die Antwort.


Log in to reply