Bonjour,
Je continue dans la joie et la bonne humeur à découvrir le C++ et je m'attaque un morceau qui me donne bien du fil à détordre. J'espère que vous allez rallumer ma lanterne.
Codant dans un environnement embarqué contraint, je dois éviter autant que possible l'allocation dynamique. Je trompe peut-être mais cela implique de se passer de std::vector. J'ai souhaité me tourner vers std::array mais hélas je n'ai pas droit à C++11 (oui je cumule...). J'ai donc tenté de coder un ersatz pour avoir un tableau à allocation sans dynamique sur lequel je pourrais avoir quelques méthodes un peu cool. Ma 1ère idée a donc été de faire quelque chose comme ça :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #ifndef ARRAY_H
#define ARRAY_H
#include <assert.h>
#include <cstddef>
template<typename __type, std::size_t __size>
struct array
{
public:
__type& operator[](std::size_t index)
{
assert(index >= 0 && index < __size && "Index is out of bounds!");
return __private_data[index];
}
std::size_t size()
{
return __size;
}
private:
__type __private_data[__size];
}; |
Ça commençait bien jusqu'à ce que je souhaite faire ça :
array<int, 3> array = { 1, 2, 3 };
Cela me donnait l'erreur suivante :
error: could not convert '{1, 2, 3}' from '<brace-enclosed initializer list>' to 'array<int, 3u>'
En regardant dans l'en-tête fournissant std::array, j'ai remarqué que le champ stockant les données était public, alors j'ai fait pareil et du coup l'erreur disparait.
Pourquoi ? 
Merci d'avance pour vos réponses !
Partager