2012-06-07 53 views
1

我偶然發現了一個對我來說毫無意義的編譯錯誤。所以,當然,我轉向StackOverflow的.....:: C++的無效使用禁止使用無類型的向量

系統

的Linux(Ubuntu的10.04 32位,海灣合作委員會(Ubuntu的4.4.3-4ubuntu5.1)4.4.3,Eclipse的靛藍

** **問題

明顯的問題,當然,;什麼是GCC抱怨

背景

我有一個類,ThreadTime,編碼在它自己的cpp和h文件,ThreadTime.cpp和.h中,並在它自己的命名空間THREAD_TIME中;在主()我啓動兩個線程,然後調用ThreadA和ThreadB,然後進入一個無限循環休眠2秒,然後檢查以查看ThreadA和ThreadB是否仍在運行。特別是,如果ThreadA已停止,它將重新啓動。

每個線程都創建一個關聯的ThreadTime對象。在我的兩個線程中都有循環。在每個循環中,ThreadTimer都會更新(在< 2秒內),所以main()循環可以看到時間在線程中前進。

當每個ThreadTimer被創建時,它的地址被添加到類型爲std::vector<ThreadTime*>的全局向量g_CthreadVector。 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

你不需要發佈整個類,你只需要發佈[minimal test case](http://sscce.org/)-complete,簡潔和具有代表性。輸出到控制檯的代碼(例如)是無關緊要的。另外,請始終標記哪條線路會產生錯誤(s)。 – outis

回答

11

沒有的std::vector聲明在你班上的範圍內。您需要一個#include <vector>

相關問題