2015-05-04 69 views
3

出於某種原因,我必須將值作爲類型指定的模板類自身返回。但問題是模板類繼承自具有方法的非模板類返回類型指定的模板類的值。在指定之前使用模板類

它應該是這樣的一個:

class Base 
{ 
    // ... 
    _Int Foo() = 0; 
}; 

template<typename T> 
class Derived 
    : public Base 
{ 
public: 
    // ... 
    _Int Foo() override 
    { 
     // ... 
    } 
}; 

typedef Derived<int> _Int; 

所以我的問題是:有沒有一種方式,可以幫助我使用指定類型的模板類的已定義之前呢?

回答

3

要聲明一個函數的返回類型,你不需要類型的定義,只有它的聲明。這意味着你可以這樣做:

template <class T> 
class Derived; 

typedef Derived<int> _Int; 

class Base 
{ 
    // ... 
    virtual _Int Foo() = 0; 
}; 

template<typename T> 
class Derived 
    : public Base 
{ 
public: 
    // ... 
    _Int Foo() override 
    { 
     // ... 
    } 
}; 

[Live example]


兩個邊筆記,無關的問題:

  • 你的代碼失蹤virtual上的Foo聲明。

  • 開始以下劃線後跟大寫字母的任何名稱保留用於C++實現(編譯器和標準庫),並且必須在用戶代碼中使用。您應該將名稱_Int更改爲其他名稱。

    包含兩個連續下劃線的名稱類似地保留,並且以下劃線開頭的名稱在全局範圍內保留。

+0

這些類位於我自己的名稱空間中。我應該採用哪種命名策略? – PENGUINLIONG

+0

@PENGUINLIONG「Int」有什麼問題?如果是在一個命名空間,'_int'在技術上是合法的爲好,但我會建議反對。我只是不會用下劃線開始我的標識符。 – Angew

+0

嗯,知道了。非常感謝。 – PENGUINLIONG

2

這是curiously recurring template pattern的一個實例,這可以通過將派生類作爲模板參數對基類可以使用:

template<typename Int> 
class Base 
{ 
    // ... 
    virtual Int Foo() = 0; 
}; 

,然後傳遞給它明確地繼承時:

template<typename T> 
class Derived 
    : public Base<Derived<T>> 
{ 
public: 
    // ... 
    Derived<T> Foo() override 
    { 
     // ... 
    } 
}; 

Live demo

+0

OP說基地不是模板。我認爲他不能根據他的措辭來改變這一點。 – rozina

+0

「但問題是模板類繼承自非模板類」。他只是說在這種情況下,基類不是模板。他並沒有在任何地方要求保持這種狀態。更不用說,他不可能改變這個類,因爲它使用了'_Int',它還沒有被定義在任何地方。 – Shoe

+0

好點。但是,我認爲如果他只想使用一種類型(_Int),就不需要將其作爲模板。 – rozina

相關問題