2015-10-21 1 views
0

Привет У меня есть код, который имеет структуру, описанную ниже. Это не настоящий код, но я попытался имитировать проблему, и она дает ту же ошибку.'unordered_set' не называет тип при объявлении его внутри файла заголовка

У меня есть файл с именем classTest.cpp, который содержит:

#include<iostream> 
#include "header.h" 

using namespace std; 
int main() 
{ 
    test f; 
    f.insert(10); 
    cout<<f.search(10)<<endl; 
    return 0; 
} 

header.h содержит следующий код:

#include<unordered_set> 
class test 
{ 
    public: 
    int apple; 
    unordered_set<int> set; 
    bool search(int a); 
    void insert(int a); 
}; 
bool test::search(int a) 
{ 
    if(apple!=a) 
     return false; 
    return true; 
     /* 
    if(set.find(a) == set.end()) 
     return false; 
    return true;*/ 
} 


void test::insert(int a) 
{ 
    apple = a; 
    //set.insert(a); 
} 

Когда я скомпилировать classTest.cpp я получаю следующее сообщение об ошибке:

header.h:6:2: error: ‘unordered_set’ does not name a type 
    unordered_set<int> set; 

Но когда я копирую содержимое header.h и вставляю его в classTest.cpp, он отлично работает. Я не могу понять причину. Есть ли какая-то базовая концепция, которую мне не хватает?

+2

Вы включая его * до * 'использованием имен станд;', но (видимо), когда вы вставили его, вы положили его после того, , Измените его на 'std :: unordered_set' в заголовке и посмотрите, не улучшились ли вещи. –

+2

Вместо этого используйте 'std :: unordered_set'. Поскольку вы, похоже, не знаете, что «using namespace std;» делает: просто прекратите использовать его и квалифицируйте имена с помощью «std ::». –

+0

О! Это была такая глупая ошибка. Работаю сейчас. – mribot

ответ

0

Как указано в комментариях: вы пытаетесь использовать unordered_set без квалификации пространства имён. Таким образом, ваш компилятор не знает, какой тип он есть.

Это работает, когда вы копируете вашу декларацию test в classTest.cpp потому, что файл имеет using namespace std.

Вы должны always qualify your types with their namespace (если не для того, чтобы избежать подобных проблем). В этом случае, чтобы решить вашу проблему, вы должны написать:

std::unordered_set<int> set; 
+0

Спасибо за ответ. Это была глупая ошибка. Я предположил, что нет необходимости в std :: как я указал пространство имен, но пропустил порядок. Но да, это решено сейчас. Я начал импортировать заголовок после использования пространства имен std. – mribot

 Смежные вопросы

  • Нет связанных вопросов^_^