С++: «набор» и «вектор» «необъявлены, несмотря на операторы #include

Я использую Netbeans 7.1 на Ubuntu 11.04.

Следующий вызов

set< Triangle > V;

выдает сообщение об ошибке

error: ‘set’ was not declared in this scope

и следующий вызов

vector< Triangle > ans;

выдает сообщение об ошибке

error: ‘vector’ was not declared in this scope

Это несмотря на то, что у меня есть

#include <vector>
#include <set>
#include <map>

в начале файла C++.

Будем очень признательны за помощь в решении этой проблемы.
Питер.


person OtagoHarbour    schedule 11.02.2012    source источник


Ответы (3)


вы забыли о пространстве имен std :

std::set‹ Треугольник > V; std::vector‹ Треугольник > V;

person axelBrain    schedule 11.02.2012

Наборы векторов и карта являются частью стандартной библиотеки С++, поэтому вам нужно вызвать вектор/набор/карту с помощью

std::vector< Triangle > ans;

или добавить

using namespace std;

после операторов включения.

person Sam Coulter    schedule 11.02.2012
comment
namespace std не является частью STL. Однако он является частью стандартной библиотеки C++. - person Ben Voigt; 12.02.2012
comment
О, Вупси. Спасибо, я только что проснулся, и мозг пукнул. Будет редактировать. - person Sam Coulter; 12.02.2012
comment
Я добавил, используя пространство имен std; после операторов включения. Кажется, это исправлено. Благодарить - person OtagoHarbour; 12.02.2012
comment
Пожалуйста, никогда не добавляйте using namespace std; в свой код. Просто укажите пространство имен; у вас есть столько времени. - person Kerrek SB; 12.02.2012
comment
@KerrekSB: Ну, я бы не сказал никогда, никогда. Никогда не помещайте это в заголовок, конечно, но если я пишу простую утилиту и извлечение всего пространства имен упрощает работу, не вызывая никаких проблем, я думаю, что это нормально. - person Ed S.; 12.02.2012

Они живут в пространстве имен std. Итак, либо полностью оцените типы (std::vector), либо используйте оператор using (using namespace std;).

Последний вариант загрязняет глобальное пространство имен. Никогда не делайте этого в заголовочном файле (иначе при включении заголовка импортируется все пространство имен) и делайте это в файле реализации только в том случае, если вы знаете, что это не приведет к коллизиям.

#include <vector>

int main(...) {
    vector v;      // no worky
    std::vector v; // ok!
}
person Ed S.    schedule 11.02.2012