2009-11-21 53 views
1

我试图做这样的事情:使用typedefs部分默认模板参数?

template <typename T,bool Strong=true> 
class Pointer {...}; 

template <typename T> 
typedef Pointer<T,false> WeakPointer; 

但是,这是一个编译错误(“typedef的模板是非法的” VC)。

我想避免使用继承来做这件事,因为这是更多不必要的工作(重写构造函数,操作符=,来回铸造,友情...)。

任何想法?

回答

2

C++ 03不支持模板化typedefs。你必须指定两种类型:

typedef Pointer<int,false> WeakIntPointer; 

我知道这不是很有帮助,但它是语言的现实。幸运的是,C++0x将支持模板类型定义。

现在,您需要制作一个模板化的WeakPointer类,它需要一个模板参数来指示类型。

7

C++ 0x将缓解这个问题,但就目前来看,你不能。

常见的解决办法是这样的:

template <typename T,bool Strong=true> 
class Pointer {...}; 

template <typename T> 
struct WeakPointer 
{ 
    typedef Pointer<T,false> value_type; 
}; 

所以不是:

typedef WeakPointer<int> WeakInt; 

你得到:

typedef WeakPointer<int>::value_type WeakInt;