Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

cannot convert from 'const double [4][4]' to 'MatriX '

6 réponses
Avatar
korchkidu
Bonjour,

je ne comprends pas pourquoi le programme suivant me sort une erreur:

#include <stdio.h>
#include <vector>

typedef double MatriX[4][4];

int main(void)
{
std::vector<MatriX> test;

MatriX matrix;

test.push_back(matrix);

return 0;
}

VC++ .NET: error C2440: 'initializing' : cannot convert from 'const
double [4][4]' to 'MatriX '

Pourquoi il me sors un const double [4][4]?

K.

6 réponses

Avatar
Horst Kraemer
korchkidu wrote:

Bonjour,

je ne comprends pas pourquoi le programme suivant me sort une erreur:

#include <stdio.h>
#include <vector>

typedef double MatriX[4][4];

int main(void)
{
std::vector<MatriX> test;

MatriX matrix;

test.push_back(matrix);

return 0;
}

VC++ .NET: error C2440: 'initializing' : cannot convert from 'const
double [4][4]' to 'MatriX '

Pourquoi il me sors un const double [4][4]?


On ne peut pas utiliser des tableaux comme élément de vector parce que
les tableaux sont des types sans opérateur de copie.

--
Horst



--
Lâche pas la patate!

Avatar
Korchkidu
Horst Kraemer wrote:

On ne peut pas utiliser des tableaux comme élément de vector parce que
les tableaux sont des types sans opérateur de copie.


Je vois. Mais imaginons que ce typedef fait parti d'une lib en C qui est
assez grande. Comment je peux faire si je veux faire ce genre de truc?
Suis-je oblige de declarer une classe qui englobe mais structure de
donnees de base?

K.

Avatar
Falk Tannhäuser
Korchkidu wrote:
Horst Kraemer wrote:
On ne peut pas utiliser des tableaux comme élément de vector parce que
les tableaux sont des types sans opérateur de copie.


Je vois. Mais imaginons que ce typedef fait parti d'une lib en C qui es t
assez grande. Comment je peux faire si je veux faire ce genre de truc?
Suis-je oblige de declarer une classe qui englobe mais structure de
donnees de base?


struct MatriX
{
double a[4][4];
};

devrait faire l'affaire. Une classe avec l'opérateur [] surchargé
rend cependant l'utilisation plus aisée :

class MatriX
{
double a[4][4];
public:
double* operator[](unsigned i) { return a[i]; }
double const* operator[](unsigned i) const { return a[i]; }
};

Falk


Avatar
Twxs

Je vois. Mais imaginons que ce typedef fait parti d'une lib en C qui est
assez grande. Comment je peux faire si je veux faire ce genre de truc?
Suis-je oblige de declarer une classe qui englobe mais structure de
donnees de base?

K.


ou faire un vector de pointeur vers cette structure

Avatar
korchkidu
Falk Tannhäuser wrote:
Korchkidu wrote:

class MatriX
{
double a[4][4];
public:
double* operator[](unsigned i) { return a[i]; }
double const* operator[](unsigned i) const { return a[i]; }
};


Je croyais interieurement a une methode miracle. Je suis bon pour faire
des wrappers pour chaque type qui pose pb (tant qu'a faire, autant faire
les operateurs qui vont bien aussi....).

Merci bcp pour les reponses,
K.

Avatar
Falk Tannhäuser
korchkidu wrote:
Falk Tannhäuser wrote:

class MatriX
{
double a[4][4];
public:
double* operator[](unsigned i) { return a[i]; }
double const* operator[](unsigned i) const { return a[i]; }
};


Je croyais interieurement a une methode miracle. Je suis bon pour faire
des wrappers pour chaque type qui pose pb (tant qu'a faire, autant fair e
les operateurs qui vont bien aussi....).


Si tu as beaucoup de matrices avec des types ou dimensions différent(e) s,
pourquoi pas faire un template :

template<typename T, unsigned Rows, unsigned Columns = Rows>
class MatriX
{
T data[Rows][Columns];
public:
// Constructeur(s), si nécessaire ?

T* operator[](unsigned i) { return data[i]; }
T const* operator[](unsigned i) const { return data[i]; }
};

...
MatriX<double, 4> m1;
MatriX<int, 3, 7> m2;


Falk