Voici mon code:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

template<int N>
class Arguments
{
protected:
    string arguments[N];
public:
    Arguments(const string(&arg)[N]) : arguments{ arg } {}
    string operator[](const int &i) const { return arguments[i]; }
};

int main()
{
    string arr[3] = { "arg1", "arg2", "arg3" };
    Arguments<3> args(arr);

    cout << args[2];

    return 0;
}

C'est l'erreur que j'obtiens:

Severity    Code    Description Project File    Line    Suppression State
Error   C2440   'initializing': cannot convert from 'const std::string [3]' to 'std::string'    
coursework_draft    C:\dev\coursework_draft\coursework_draft\coursework_draft.cpp   13  

Que dois-je changer?

2
Maxim Yarmolik 19 mai 2020 à 19:56

3 réponses

Meilleure réponse

Les tableaux ne sont pas copiables en C ++. Donc ça ne marchera jamais

 Arguments(const string(&arg)[N]) : arguments{ arg } {}

Vous pouvez utiliser std::array<std::string, N> à la place, ou vous pouvez copier le tableau élément par élément dans le corps du constructeur.

5
john 19 mai 2020 à 17:00

Cette:

arguments{ arg }

Est une initialisation de liste et signifie que le premier élément de arguments est initialisé avec arg. Mais les éléments de arguments sont std::string, qui ne peuvent pas être initialisés avec un tableau de chaînes.

Les tableaux ne peuvent pas être initialisés par copie.

Cependant, les classes peuvent être initialisables en copie et peuvent avoir des membres de tableau. En tant que tel, vous pouvez utiliser une classe comme wrapper autour d'un tableau qui peut être facilement copié. La bibliothèque standard a un modèle pour un tel wrapper de tableau. Son nom est std::array.

Une autre option consiste à copier le tableau dans le corps du constructeur en utilisant std::copy ou une fonction similaire.

1
eerorika 19 mai 2020 à 17:04

Vous pouvez utiliser std::copy:

Arguments(const string(&arg)[N]) {
   std::copy(arg, arg + N, arguments); 
}

Voici une démo.

0
cigien 19 mai 2020 à 17:03