给出一个模板类:
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 ++没有允许在返回类型上重载。
我想...... 颤抖 ......宏会解决它:
#define NEW_SOMECLASS(TYPE) ((new SomeClass<TYPE>)->GetClient())
auto some_class = NEW_SOMECLASS(int);
但是必须有一种合理的方式来公开模板类的对象创建,而不需要使用宏或其他繁琐的构造?
答案 0 :(得分: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',那么您可以使用它:
auto some_class = SomeClass<int>::create();
答案 1 :(得分:0)
您可以尝试使用默认类型作为模板类型参数