2017-08-28 112 views
0

我正在創建一個多線程類方法,需要調用compute轉發聲明混亂

void compute(const Me::MyClass<T>& c1, Me:: MyClass<T>& target,std::size_t start); 

namespace Me{ 
    template<typename T> class MyClass{ 

     computeMultiThreaded(){ 

      MyClass<T> target = MyClass(); 

      std::size_t n_threads = std::thread::hardware_concurrency(); 

      std::vector<std::tuple<std::size_t, std::size_t>> parts = split_job(n_threads, number_jobs); 
      std::vector<std::thread> threads; 

      for (std::size_t ti = 0; ti < n_threads; ti++) 
      { 
       // , parts[ti], minCol, this, m2, returnMatrix)); 
       threads.push_back(std::thread(compute,parts[ti])); 
      } 
     } 
    } 
} 


void compute(const Me::MyClass<T>& c1, Me:: MyClass<T>& target,std::size_t start){ 
... 
} 

現在,當我嘗試compute定義MyClass後,Me::MyClass是不是在compute第一個定義稱爲編譯此。當我刪除第一個聲明時,創建線程時不會知道compute

我該如何解決這個問題22?

error: use of undeclared identifier 'Me' 
+0

是否 使用Me :: MyClass; 有幫助嗎? – tpdi

+0

這是一個大型項目的簡化示例... –

+0

是的,因爲在聲明它之前使用了'Me'。所以命名空間必須在之前聲明。 – Raindrop7

回答

4

的問題是,編譯器不知道的Me::MyClass存在時,它讀取的compute聲明。所以我們需要做的就是告訴它該課程存在!

namespace Me { 
    template<typename T> class MyClass; 
} 

以後可以定義Me::MyClass像這樣

template<typename T> class Me::MyClass { 
// insert your class definition 
}; 

的第一個片段是一個類的聲明,第二個是一個類定義。

5

在聲明compute之前聲明MyClass。如果你想讓它有任意的MyClass<T>參數類型,compute需要是一個函數模板。

namespace Me 
{ 
    template<typename T> 
    class MyClass; 
} 

template<typename T> 
void compute(const Me::MyClass<T>& c1, Me:: MyClass<T>& target,std::size_t start); 
0

可以「向前聲明」的命名空間,幷包括類的向前聲明後來做的正確:

namespace Me { 
    template<typename T> class MyClass; 
    template <class T> 
    void compute(const MyClass<T>& c1, MyClass<T>& target, std::size_t start); 
} 

再後來:

//template<class T> 
//void compute(const Me::MyClass<T>& c1, Me::MyClass<T>& target, std::size_t start); // Correct but it is already declared in namespace "Me" 

現在的定義:

namespace Me { 
    template<typename T> class MyClass 
    { 
     void computeMultiThreaded() { // I added void here so you should add a return type 
      MyClass<T> target = MyClass(); 

      std::size_t n_threads = std::thread::hardware_concurrency(); 

      std::vector<std::tuple<std::size_t, std::size_t>> parts = split_job(n_threads, number_jobs); 
      std::vector<std::thread> threads; 

      for (std::size_t ti = 0; ti < n_threads; ti++) 
      { 
       // , parts[ti], minCol, this, m2, returnMatrix)); 
       threads.push_back(std::thread(compute, parts[ti])); 
      } 
     } 
    }; // you missed also the semicolon in your example 
} 

template <class T> 
void compute(const Me::MyClass<T>& c1, Me::MyClass<T>& target, std::size_t start) { 

} 

我希望這對你有用。