请看如下一段代码:
template <class ElemType>
void PostOrderTraverse_I(TreeNode<ElemType>* t,void (*Visit)(ElemType& e))
{
struct StackNode
{
TreeNode<ElemType>* ptr;
int tag;
};
StackNode<ElemType> curnode,topnode;
LinkStack<StackNode<ElemType> > S;
······
}
其中LinkStack是我自己写的链栈类,是一个模板类。上面的这段代码编译出错。提示是这样的:
error: template argument for 'template<class ElemType> class LinkStack'uses local type 'PostOrderTraverse_I(TreeNode<ElemType>*, void (*)(ElemType&)) [with ElemType = char]::StackNode'|
查了资料,才知道在2003 C++ Standard中给出了下面的说法:
A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as atemplate-argument for a template type-parameter.
于是,我就把struct StackNode写在了函数PostOrderTraverse_I的外面:
template <class ElemType>
struct StackNode
{
TreeNode<ElemType>* ptr;
int tag;
};
template <class ElemType>
void PostOrderTraverse_I(TreeNode<ElemType>* t,void (*Visit)(ElemType& e))
{
StackNode<ElemType> curnode,topnode;
LinkStack<StackNode<ElemType> > S;
······
}
再编译,通过。