Как я могу вернуть вектор <T>из функции в C ++ - PullRequest
4 голосов
/ 26 января 2011

Я создаю общую структуру данных и хочу вернуть вектор, содержащий некоторые объекты в моей структуре.

Я пытался

template<class T>
vector<T> DataStructure<T>::getItems(int count)
{
    vector<T> items;
    for(int i = 0; i < count; i++)
        items.push_back(data[i]);      
    return items;
}

Но компилятор сообщает об ошибке

: ISO C ++ запрещает объявление 'vector' без типа

Ошибка: ожидается;»до '<' токена </p>

Ответы [ 4 ]

8 голосов
/ 26 января 2011

vector не определено.

Вам необходимо #include <vector> и указать его пространство имен, используя std::vector или поместив using namespace std; в вашу функцию или в глобальную область (это последнее предложениеследует избегать).


#include <vector>

template<class T>
std::vector<T> DataStructure<T>::getItems(int count)
{
    std::vector<T> items;
    for(int i = 0; i < count; i++)
        items.push_back(data[i]);      
    return items;
}
4 голосов
/ 26 января 2011

Это std::vector, а не просто vector. Кроме этого, data не определено во фрагменте. Но в целом это способ вернуть вектор.

2 голосов
/ 26 января 2011

В качестве дополнения к идеальному ответу @etarion наиболее идиоматичным способом выполнения вашей операции является допущение, что data имеет тип T*:

template<class T>
std::vector<T> DataStructure<T>::getItems(int count)
{
    return std::vector<T>(data, data + count);
}
0 голосов
/ 26 января 2011

Поскольку определение getItems в любом случае должно быть доступно через заголовок, так как это метод шаблона класса, его проще всего определить в определении класса:

template<class T>
struct DataStructure {
  std::vector<T> getItems(int count) const {
    assert(0 <= count && count <= data.size());  // don't forget to check count

    // if you must use op[] with data:
    // std::vector<T> items;
    // for(int i = 0; i < count; i++)
    //   items.push_back(data[i]);      
    // return items;

    // if data is a container (using random-access iterators here):
    return std::vector<T>(data.begin(), data.begin() + count);

    // if data is an array:
    // return std::vector<T>(data, data + count);
  }

  std::vector<T> data;  // or is data something else?
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...