2011-01-24 50 views
4

GCC不會編譯下面的代碼片段(這實際上是GCC的正確行爲,因爲它是符合標準的C++,因爲我已經學會了。VC++但將編譯)呼叫從一個模板類中的模板功能

template<class T> 
void CUDAMemory1D2DTextureAllocator<T>::allocateMemoryOnDevice() 
{ 
    m_pChannelDesc = cudaCreateChannelDesc<T>(); 
    ... 
} 

正如我已經發現通過搜索是,那個人需要告訴編譯器cudaCreateChannelDesc是一種模板方法。否則,它會嘗試 解析<作爲比運營商更小的...

下面的代碼片段顯示,在一個簡單的例子:

template< typename G > 
struct Test 
{ 
    template< typename T > T f() const; 
}; 

template< typename G, typename T > 
void g() 
{ 
    Test<G> t; 

    t.f<T>();   // ERROR: gcc won't compile that 
    t.template f<T>(); // OK: now gcc knows that f is a template method an treads the following angle brackets not as operators but as template brackets... 
} 

到目前爲止好。現在我的問題是,在上述情況下如何做到這一點,我調用的方法是cudaCreateChannelDesc,它不屬於任何類或名稱空間? 任何意見或建議如何解決這種情況是非常受歡迎的。

感謝

+0

你只需要`模板`而不是創建臨時模板。你有, – GManNickG 2011-01-24 07:46:33

回答

2

如果它不屬於任何類或名稱空間,可以直接調用它:cudaCreateChannelDesc<T>()。它不是那樣工作嗎?

+0

謝謝。是的,你是對的。我可以像這樣調用函數(就像我第一次嘗試的那樣)。問題是,我編寫的模板類是從Serializer類派生的,其中創建了模板類的專用實例。我必須重新檢查這裏涉及的孔代碼,以瞭解發生了什麼。但不知怎的,這引起了gcc編譯器錯誤,指出「預期的主表達式在'>'之前」,這讓我想到他有問題解決了cudaCreateChannelDesc本身就是一個模板。 – Tobias 2011-01-24 07:45:00

1

在一些命名空間,你在範圍上有聲明的cudaCreateChannelDesc功能?看起來你可能在使用兩階段名稱查找時遇到問題,這需要在模板實例化之前,模板中引用的某些實體(如函數)需要可見。如果您在與allocateMemoryOnDevice的定義相同的位置編寫非模板函數,並在其中調用cudaCreateChannelDesc,那麼代碼是否會編譯?如果沒有,您可能會錯過#includecudaCreateChannelDesc上的名稱空間限定。

+0

Dan Paradox是對的,它正在工作,因爲這個函數不屬於任何類或名字空間,還有一些其他錯誤誤導了我。悖論答案的細節。 – Tobias 2011-01-24 07:45:31

2

我假設cudaCreateChannel1Desc不是全局或命名空間函數,因爲這應該工作,除非您忘記了包含或名稱空間解析。你確實說它是一個「方法」,即一個成員函數。

所以,如果是CUDAMemory1D2DTextureAllocator類的方法,那麼你應該使用this->template cudaCreateChannel1Desc<T>()調用該方法(這是我推斷是一個模板基類的CUDAMemory1D2DTextureAllocator的方法。下面是什麼工作的緊湊的詮釋什麼不是在不同的情況下(至少在gcc上):

template <class G> 
struct Base { 

    template< class T > 
    T h() const { 
    std::cout << "Hello World!" << std::endl; 
    }; 
}; 

template< class G > 
struct Test : public Base<G> 
{ 
    template< class T > 
    T f() const { 
     std::cout << "Hello World!" << std::endl; 
    }; 

    void callF() const { 
     f<G>();    //works! 
     this->f<G>();   //works! 
     h<G>();    //ERROR! 
     this->h<G>();   //ERROR! 
     this->template h<G>(); //works! 
    }; 
}; 
+0

我很抱歉發生錯誤。事實上,我並不是指'方法',而是'功能'。 – Tobias 2011-01-24 07:50:22