2015-08-13 3 views
0

Я пытаюсь выполнить свой первый проект на C++ и начинаю с малого, я думаю. Я использую Eclipse Luna и пытаюсь использовать значения по умолчанию для сборки env везде, где могу. Я подозреваю, что следующее - это наивный код, но вы должны что-то начать.linux eclipse C++ local namespaces и "std ::"

я в конечном итоге иметь 4 ш/суб проекты в этом:

  1. Commandline интерфейс к статическому Lib
  2. «.so» Lib, который будет динамически загружен в другой, thied приложения и использования партии static lib
  3. Статическая библиотека, упомянутая выше, которая выполняет заднюю работу объединенного приложения.
  4. Утилитный класс (на данный момент, возможно, небольшой lib позже) для классов полезности и функций, общих для других подпроектов.

Существует множество вопросов о лучших практиках, пространствах имен и т. Д., Которые я хотел бы задать, но я сохраню это.

У меня есть следующий файл C++ заголовок:

/* 
* Utilities.h 
* 
*/ 

#ifndef UTILITIES_H_ 
#define UTILITIES_H_ 

// A 

namespace UserTrackingUtilities { 
// B 
#include <string> 
#include <exception> 
    using namespace std; 

    class MyException: public std::exception { 
     public: 
      MyException(std::string ss) : s(ss) { 
      } 
      ~MyException() throw() { 
      } // Updated 

      std::string s; 

      const char* what() const throw() { 
       return s.c_str(); 
      } 
    }; 
} 

#endif /* UTILITIES_H_ */ 

Это утилита исключение (находится в другом StackOverflow потоке), что я оборачивать в пространстве имен моего собственного - я думаю.

Eclipse показывает несколько проблем с этим заголовочным файлом. Я начну с одного: ему не нравится конструкция std::string. Не имеет значения, поставил ли я #include s и/или операторы using в точке A или B.

Я также пробовал это с помощью цепей инструментов GCC и ADT Linux.

Указатели и рекомендации приветствуются.

+1

Не помещайте '# include' заявления внутри пространств имен. Ваш код компилируется для меня, когда я перемещаю '# includes' в точку' A'. – Galik

+0

И не говорите 'using namespace std;'. – juanchopanza

+0

Eclipse Luna и Mars с CDT питаются этим файлом даже с включенными и 'using namespace std;' в позиции B. Смерть 'using namspace std;', между прочим. – user4581301

ответ

3
#include <string> 
#include <exception> 

Должно быть, прежде

namespace UserTrackingUtilities { 

КСТАТИ:

Если вы используете using namespace std, вы можете написать string вместо std::string.

Но я предлагаю не использоватьusing namespace std, чтобы избежать конфликтов имен и двусмысленностей.

Update:

Вот минимальный рабочий пример:

#include <iostream> 
#include <string> 
#include <exception> 

namespace UserTrackingUtilities { 

    class MyException: public std::exception { 
     public: 
      MyException(std::string ss) : s(ss) { 
      } 
      ~MyException() throw() { 
      } // Updated 

      std::string s; 

      const char* what() const throw() { 
       return s.c_str(); 
      } 
    }; 
} 

int main() 
{ 
    UserTrackingUtilities::MyException ex("Hello World"); 
    std::cout << ex.what() << std::endl; 
    return 0; 
} 
+0

Это заставляет мой мозг болеть. Я перемещаю их в точку А и удаляю пространство имен std с помощью.'Std :: string s;' говорит мне ''string' в пространстве имен 'std' не называет тип' –

+0

строки 'return s.c_str();' говорит мне, что s не определено в этой области. Я думаю, что мое затмение было закрыто –

+0

@ 7Reeds Если вы получаете ошибку компилятора, очень редко очень редко возникает ошибка компилятора или IDE. – sergej