2010-01-20 61 views
2

給定一個模板類作爲這樣對象創建包裝:爲模板類

template <typename TYPE> 
class SomeClass { 
public: 
    typedef boost::intrusive_ptr<SomeClass<TYPE> > Client_t; 
    inline Client_t GetClient() { return Client_t(this); } 
}; 

SomeClass的是僅用於經由由SomeClass的:: GetClient()返回的指針的參考文獻中使用。這使得它自然地寫這樣圍繞創建一個包裝函數:

template <typename TYPE> 
SomeClass<TYPE>::Client_t New_SomeClass() { 
    return (new SomeClass<TYPE>)->GetClient(); 
} 

GCC 4.4下編譯上面的代碼:

SomeClass<int>::Client_t some_class = New_SomeClass(); 

給出了錯誤「‘New_SomeClass’在此範圍內未聲明」

現在我不是模板嚮導,所以在這裏可能有細節我不知道,但我猜我不能使用這種類型的構造,因爲事實上,C++ doesn' t允許在返回類型上重載。

我猜... 哆嗦 ...宏將解決這個問題:

#define NEW_SOMECLASS(TYPE) ((new SomeClass<TYPE>)->GetClient()) 

auto some_class = NEW_SOMECLASS(int); 

但必須有揭露模板類的對象創建一個明智的方式,而不訴諸宏或其他繁瑣的構造?

回答

2
SomeClass<int>::Client_t some_class = New_SomeClass<int>(); 

因爲對於New_SomeClass模板參數不依賴於一個函數的參數,你必須指定它們。您報告的錯誤消息對於此問題有點奇怪,但是,您可能還有其他事情正在進行。

或者說,我的偏好,而不是New_SomeClass功能:

template<class T> 
struct SomeClass { 
    typedef boost::intrusive_ptr<SomeClass> Client; 
    inline Client client() { return Client_t(this); } 

    static Client create() { return (new SomeClass())->client(); } 

private: 
    SomeClass(); // can be public too, if you really need it accessible 
}; 

//... 
SomeClass<int>::Client some_class = SomeClass<int>::create(); 

即使它本質上只是移動功能「到」之類的,我覺得很一般清潔劑。

在任何情況下,如果你的編譯器支持0X的「汽車」,那麼你可以使用它:

auto some_class = SomeClass<int>::create(); 
+0

兩個字:優秀的答案。 – porgarmingduod 2010-01-20 09:13:53

0

,你可以嘗試使用默認類型模板類型參數

+1

函數模板不能有默認值,我不知道是出現「詮釋它,它怎麼會在這裏幫助'只是這個例子的一部分。 – 2010-01-20 09:06:20