2012-06-15 2 views
4

При попытке скомпилировать этот код:вектор определяемого пользователем типа

#include <iostream> 
#include <vector> 
using namespace std; 

class Test { 
    int a; 

public: 
    Test(int pa) : a(pa) { } 

    void print() { 
     std::cout << a << std::endl; 
    } 
}; 

int main() { 

    Test t(31415); 

    t.print(); 

    vector<Test &> vet; 

    vet.push_back(&t); 

    return 0; 
} 

GCC 4.4.5-8 отчет различные erros, начиная с:

In file included from /usr/include/c++/4.4/i486-linux-gnu/bits/c++allocator.h:34, 
       from /usr/include/c++/4.4/bits/allocator.h:48, 
       from /usr/include/c++/4.4/string:43, 
       from /usr/include/c++/4.4/bits/locale_classes.h:42, 
       from /usr/include/c++/4.4/bits/ios_base.h:43, 
       from /usr/include/c++/4.4/ios:43, 
       from /usr/include/c++/4.4/ostream:40, 
       from /usr/include/c++/4.4/iostream:40, 
       from references.cpp:1: 
/usr/include/c++/4.4/ext/new_allocator.h: In instantiation of ‘__gnu_cxx::new_allocator<Test&>’: 
/usr/include/c++/4.4/bits/allocator.h:87: instantiated from ‘std::allocator<Test&>’ 
/usr/include/c++/4.4/bits/stl_vector.h:71: instantiated from ‘std::_Vector_base<Test&, std::allocator<Test&> >’ 
/usr/include/c++/4.4/bits/stl_vector.h:171: instantiated from ‘std::vector<Test&, std::allocator<Test&> >’ 
references.cpp:22: instantiated from here 
... 

где ошибка?

+2

вы не можете иметь вектор ссылок. Элементы добавляются в векторы, копируя их. http://stackoverflow.com/questions/922360/why-cant-i-make-a-vector-of-references – Joe

ответ

8

Проблема в том, что вы пытаетесь создать вектор ссылок. Тип объекта, который должен быть сохранен в векторе, должен быть назначен, что не относится к ссылкам. Ссылка может быть инициализирована только после объявления и не может быть изменена позже.

То, что вы, скорее всего, хочу

Test t(31415); 
std::vector<Test> vet; 
vet.push_back(t); 

, который создает копию t, который затем хранится в векторе.

Вы можете увидеть проблему в сообщениях об ошибках компилятора, хотя они довольно загадочны. Компилятор не может сгенерировать код для *allocator<Test&>, который заботится о распределении памяти объектов, которые будут храниться в векторе, - нет возможности выделить память для ссылки.

1

вы могли бы использовать новый C++ 11 move-semantics или использовать вектор указателей на Test, если копирование не соответствует требованиям

1

Как уже говорили другие, вы можете создать вектор указателей вместо:

vector<Object*> vet; 
... 
while (blabla) { 
    Object* I = SF.CurObject++; 
    vet.push_back(I); 
} 

вы можете использовать ссылку, если вы настаиваете:

Object& Iref = *I; 
Смежные вопросы