2012-10-09 66 views
15

我有一些代碼需要前向聲明一個模板類(或者至少,前向聲明會使事情對我來說變得更容易。 ..)。我已經寫了我有這麼一個問題的簡化版本,我可以在這裏顯示出來:正向聲明模板類時的「未定義模板的隱式實例化」

template<bool> 
class MyTemplateClass; 

int main(int argc, char* argv[]) 
{ 
    MyTemplateClass<false> myTemp; // error here 
    myTemp.GetTheValue(); 
    return 0; 
} 

template<bool bShouldMult> 
class MyTemplateClass 
{ 
    int m_myint; 
    float m_myfloat; 

public: 
    MyTemplateClass() : m_myint(5), m_myfloat(3.0f) {} 
    float GetTheValue() 
    { 
     return m_myint * (bShouldMult ? m_myfloat : 1.0f); 
    } 

}; 

我在註釋行得到的錯誤是:

Error - implicit instantiation of undefined template 'MyTemplateClass<false>' 

什麼其他細節我需要包含在MyTemplateClass的前向聲明中嗎?由於錯誤不是來自下一行,我假設它不是由於該方法未定義的事實。我使用的編譯器是LLVM/CLang,我正在Mac上進行編譯。

回答

13

向前定義非常廣泛的支持,以聲明任何類型,模板或不是一個變量,該類型的定義整個必須是可用的。您不能轉發聲明模板,然後開始使用它,就好像它已經定義一樣。所有你能在這一點上做的是聲明的指針,基於模板,這樣的類型的對象:

MyTemplateClass<false> *myTempPtr; // No error here 

不幸的是(但不意外),此招式錯誤到下一行。初始化該指針的問題仍然存在:一旦您嘗試調用new MyTemplateClass<false>,您將看到一個錯誤。

您需要重新安排代碼以將模板的定義提前使用。這可能有點乏味,但是沒有辦法解決它:編譯器需要在開始實例化模板並調用其方法的位置具有完整的定義。

0

從我的理解,你不能轉發聲明的東西,然後實例化它在你的堆棧(模板或不)。

此外,我不認爲有模板類

19

你忘了#include的東西嗎?

我得到這個忘記

#include <array> 

後,當使用std::array