2012-03-09 16 views
2

Я пытаюсь использовать предлагаемые функции here, чтобы разделить строку на разделитель, но я получаю несколько ошибок всякий раз, когда я пытаюсь использовать vector<string> в качестве возвращаемого типа.C++ Невозможно использовать вектор <string> как возвращаемый тип

я сделал простую функцию, которая возвращает vector<string> как испытание, но я все еще получаю те же ошибки:

// 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; 
    } 
} 

И скриншот ошибки: Errors

Кто-нибудь знает, почему я, кажется, не в состоянии использовать vector<string> в качестве возвращаемого типа?

+0

ваш тип возвращаемого значения должны быть 'станд :: вектор ' –

+0

@ e.James как '' string' и VECTOR' находятся в пространстве имен 'std', правильно? SO не должен «использовать пространство имен std;» позаботиться об этом? – WilHall

+2

Кроме того: обычно считается очень плохой практикой «использовать» внутри файла .h. Особенно тот, который ссылается на пространства имен по сравнению с типами – JaredPar

ответ

13

Это не является допустимым vector<string> конструктор:

vector<string> thing(one, two); 

Изменения в (например):

std::vector<std::string> TestFunction(std::string one, std::string two) { 
    std::vector<std::string> thing; 

    thing.push_back(one); 
    thing.push_back(two); 

    return thing; 
} 

Также рассмотреть изменения параметров, чтобы быть const std::string&, чтобы избежать ненужной копии.

+0

Возможно, это исправлено, но я бы хотел использовать синтаксис списка в соответствии с вашей ссылкой, то есть: 'vector вещь {один, два};' - но это не работает, см. Http: : //cl.ly/3m2O1E0e3X2L2y1y0036 – WilHall

+0

Вам нужно включить функции C++ 11, чтобы включить этот синтаксис, если ваш компилятор поддерживает его. –

+1

@WilHall Согласно [этой таблице] (http://wiki.apache.org/stdcxx/C++0xCompilerSupport), только gcc уже поддерживает списки инициализаторов (и clang ++ в своем репозитории svn, если вы следуете ссылке). – alexisdm

1

тип строки на самом деле является членом пространства имен std::. Правильный тип возврата для вашей функции будет std::vector<std::string>.

Вы можете избежать использования префикса std:: в файле СРР из линии using namespace std;, но в вашем заголовке, вы должны включать префикс std::.

Что бы вы ни делали, сделайте не поместите using namespace std; в файл заголовка.

+1

Его заголовок имеет 'using namespace std;' ... –

+0

@JeffMercado: eugh! –

2

Проблема не в обратном типе, а при вызове конструктора. Компилятор выбирая std::vector конструктор:

template <typename InputIterator> 
vector(InputIterator b, InputIterator e); 

как лучший кандидат, которого она по стандарту, подставляя std::string в качестве параметра InputIterator. Кажется, ваш компилятор использует черты внутри, чтобы убедиться, что аргумент действительно соответствует требованиям InputIterator и жалуется, потому что std::string не выполняет эти требования.

Простое решение заключается в изменении кода в функции:

std::vector<std::string> v; 
v.push_back(one); 
v.push_back(two); 
return v; 
Смежные вопросы