2012-06-07 3 views
1

Я наткнулся на ошибку компиляции, которая не имеет для меня никакого смысла. Так, конечно, я перехожу к StackOverflow .....Недопустимое использование :: - C++ запрещает использование вектора без типа

Система

Linux (Ubuntu 10,04 32 бит, GCC (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3, Eclipse Indigo

** вопрос **

Очевидный вопрос, конечно, Что НКУ жалуясь фон

о

?

У меня есть класс ThreadTime, закодированный в его собственных файлах cpp и h, ThreadTime.cpp и .h и внутри собственного пространства имен THREAD_TIME;

В main() Я запускаю два потока, вызываю ThreadA и ThreadB, затем перехожу в бесконечный цикл, который спит 2 секунды, затем проверяет, все ли запущены ThreadA и ThreadB. в частности, если ThreadA остановлен, он перезапускается.

Каждый поток создает связанный объект ThreadTime. В обоих моих потоках есть петли. Во время каждого цикла ThreadTimer обновляется (в < 2 сек), поэтому цикл main() может видеть, что время идет в потоках.

По мере создания каждого ThreadTimer его адрес добавляется к глобальному вектору g_CthreadVector типа std::vector<ThreadTime*>. g_CthreadVector является глобальным файлом в ThreadType.cpp.

Возможно, лучше всего вставить весь класс здесь. Так что ...

ThreadTime.cpp

#include "ThreadTime. 

namespace THREAD_TIME 
{ 
    std::vector<ThreadTime*>  g_CthreadVector; // threads to kill and monitor 

    ThreadTime::ThreadTime(thread_t* a, time_t b, void* c) 
    : m_pthread(a), m_time(b), m_lasttime(b-2), m_function(c), m_terminate (FALSE) 
    { 
     m_name = "a ThreadTime object"; 
     g_CthreadVector.push_back(this); 
    } 

    ThreadTime::~ThreadTime() 
    { 
     std::vector<ThreadTime*>::iterator  it  (GetIterator()); 
     if (it != g_CthreadVector.end()) 
     g_CthreadVector.erase(it); 
    } 

    void  ThreadTime::UpdateTime(void) 
    { 
     m_lasttime = m_time;            // save the time to lasttime 
     m_time = time(NULL);            // store the current time 
     if (m_lasttime == m_time)          // safety valve keep m_time 
     m_lasttime--;             //  ahead of m_lasttime 
    } 

    //--------------------------------------------------------- 
    // did time get advanced? 
    //--------------------------------------------------------- 
    bool  ThreadTime::TimeAdvanced(void) 
    { 
     if (m_lasttime < m_time)  return TRUE; 
     else        return FALSE; 
    } 

    void  ThreadTime::print(void) 
    { 
     std::vector<ThreadTime*>::iterator  tt_it (GetIterator()); 
     std::vector<ThreadTime*>::iterator  it  (g_CthreadVector.end()); 

     for (it = g_CthreadVector.begin(); it < g_CthreadVector.end(); it++) 
     { 
      if (tt_it == it) 
       std::cout << " ################### CURRENT OBJECT ###################### " << std::endl; 
      else 
       std::cout << " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ " << std::endl; 

      std::cout << " ThreadTime Object: " << (*it)->getName() << std::endl 
         << "   thread ptr: " << (*it)->m_pthread << std::endl 
         << "    time: " << (*it)->m_time  << std::endl 
         << "   lasttime: " << (*it)->m_lasttime << std::endl 
         << "  function ptr: " << (*it)->m_function << std::endl 
         << "   terminate: " << (*it)->m_terminate << std::endl; 
     } 
     std::cout << " $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ " << std::endl; 
    }  // for (it ...) 

    std::vector<ThreadTime*>::iterator ThreadTime::GetIterator(void) 
    { 
     std::vector<ThreadTime*>::iterator  it  (g_CthreadVector.end()); 

     for (it = g_CthreadVector.begin(); it < g_CthreadVector.end(); it++) 
     { 
     if ((*it)->m_pthread == m_pthread) 
      break; 
     } 

     return it; 
    } 

} /* namespace THREAD_TIME */ 

ThreadTime.h

#ifndef THREADTIME_H_ 
    #define THREADTIME_H_ 

    #include "platform.h" 
    #include "opsys_common.h" 
    #include "NAS_Thread.h" 


    namespace THREAD_TIME 
    { 
     class ThreadTime; 

     class ThreadTime 
     { 
     public: 
      std::string  getName() const     { return m_name; } 
      void    setName(std::string name)  { m_name = name; } 

      ThreadTime(thread_t* a, time_t b, void* c); 
      ~ThreadTime(); 
      void  UpdateTime(void); 
      bool  TimeAdvanced(void); 
      void  print(void); 

     private: 
      std::vector<ThreadTime*>::iterator  GetIterator(void); 

      std::string m_name; 
      thread_t*  m_pthread; 
      time_t   m_time; 
      time_t   m_lasttime; 
      void*   m_function; 
      bool   m_terminate; 
    }; 

} /* namespace THREAD_TIME */ 

#endif /* THREADTIME_H_ */ 

И, наконец, вот сообщения об ошибках:

‘;’ ожидается до того ‘<’ лексема ThreadTime.h линия 37

недопустимое использование ‘::’ ThreadTime.h линии 37

ISO C++ запрещает декларации ‘vector’ без каких-либо типа ThreadTime.h линии 37

+3

Есть ли точка вместо закрывающей цитаты в вашей первой директиве '# include'? – dasblinkenlight

+8

Я предполагаю, что вы не включаете в ThreadTime.h –

+2

Вам не нужно публиковать весь класс, вам просто нужно отправить [минимальный тестовый пример] (http://sscce.org/) -полный, кратким и представительным. Код для вывода на консоль (например) является посторонним. Кроме того, всегда указывайте, какая строка (-ы) производит// ошибку (-ы). – outis

ответ

11

Там нет декларации std::vector для вашего класса. Вам нужен #include <vector>.

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