C++ pas utiliser vector<string> comme type de retour
Je suis en train d'utiliser les fonctions suggéré ici de découper une chaîne par un séparateur, mais j'obtiens une poignée d'erreurs à chaque fois que j'essaie d'utiliser vector<string>
un type de retour.
J'ai fait une simple fonction qui retourne un vector<string>
comme un test, mais je suis toujours les mêmes erreurs:
//Test.h
#pragma once
#include <vector>
#include <string>
using namespace std;
using namespace System;
namespace Test
{
vector<string> TestFunction(string one, string two);
}
.
//Test.cpp
#include "stdafx.h"
#include "Test.h"
namespace Test
{
vector<string> TestFunction(string one, string two) {
vector<string> thing(one, two);
return thing;
}
}
Et une capture d'écran des erreurs:
Personne ne sait pourquoi il me semble être incapable d'utiliser vector<string>
un type de retour?
votre type de retour devra être
les deux
De côté: il est généralement considéré comme très mauvaise pratique d'avoir un
oui, mon mauvais. Je ne savais pas qu'il y avait un
std::vector<std::string>
les deux
string
et vector
sont dans le std
espace de noms, non? DONC ne devrait pas using namespace std;
prendre soin de cela?De côté: il est généralement considéré comme très mauvaise pratique d'avoir un
using
à l'intérieur d'un .h fichier. En particulier avec des références à des espaces de noms vs typesvector<string> thing(one, two);
ce n'est pas initialiser le vecteur avec deux chaînes, il n'existe pas de constructeur.oui, mon mauvais. Je ne savais pas qu'il y avait un
using
directive dans l'en-tête. Effrayant!OriginalL'auteur WilHall | 2012-03-09
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas valide
vector<string>
constructeur:Changement (par exemple):
Aussi envisager de modifier les paramètres à
const std::string&
pour éviter la copie.vector<string> thing {one, two};
- mais c'est un échec, voir: cl.ly/3m2O1E0e3X2L2y1y0036Vous aurez besoin de permis C++11 caractéristiques afin de permettre à cette syntaxe, si votre compilateur prend en charge.
Selon table, seulement gcc supporte déjà l'initialiseur de listes (et clang++ dans son référentiel svn, si vous suivez le lien) .
Je suis à l'aide de Visual Studio 2010 - bien que cette question suggère d'initialiseur de listes ne sont pas pris en charge D: - stackoverflow.com/questions/5121529/...
OriginalL'auteur hmjd
Le problème n'est pas avec le type de retour, mais avec l'appel au constructeur. Le compilateur est le choix
std::vector
constructeur:comme le meilleur candidat, il est conforme à la norme, par la substitution
std::string
comme leInputIterator
paramètre. Votre compilateur semble être à l'aide de traits en interne pour vérifier que l'argument fait conforme avec les exigences deInputIterator
et se plaindre parce questd::string
ne remplit pas ces exigences.La solution la plus simple est de modifier le code de la fonction:
OriginalL'auteur David Rodríguez - dribeas
le type string est en fait un membre de la
std::
espace de noms. Le bon type de retour de ta fonction serastd::vector<std::string>
.Vous êtes en mesure d'éviter d'utiliser le
std::
préfixe dans votre fichier CPP à cause de la ligneusing namespace std;
, mais dans votre tête, vous doit inclure lastd::
préfixe.Quoi que vous fassiez, ne pas lieu le
using namespace std;
dans le fichier d'en-tête.using namespace std;
...eugh!
OriginalL'auteur e.James