2010-01-20 75 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