2012-01-18 69 views
2

此刻,我正在驾车弯道。作为一个自制的练习,我想在一个类中模拟一个递归调用。在.h文件我有:模板递归函数的语法是什么?

template <typename T1> 

    class BinaryTree 
    { 
    public: 
     BinaryTree(T1 element); 
     ~BinaryTree(); 

    BinaryTree* addLeftLeaf(BinaryTree<T1>* node); 

等等

然后在.cpp

template <typename T1> BinaryTree* BinaryTree<T1>::addLeftLeaf(BinaryTree<T1>* node) 
{ 
    return node; 
} 

我试过的想法看似负载,但迄今一无所获。只是错误,如错误C2955:'BinaryTree':使用类模板需要模板参数列表

任何建议,将不胜感激。

感谢

马克

+0

错误是返回类型不是模板。但是模板代码(通常)需要在头文件中。所以把整个事情放在类定义里面,问题就会消失。 – 2012-01-19 00:06:17

回答

0

你不能在.cpp文件中的模板函数的定义,它必须是在.h文件:)

也,彼得·亚历山大是正确的关于需要对源代码中的那个函数定义进行编辑,我会将其留给他的答案:)

8

在源文件中,您需要指定BinaryTree<T1>而不仅仅是BinaryTree。即

template <typename T1> 
BinaryTree<T1>* BinaryTree<T1>::addLeftLeaf(BinaryTree<T1>* node) 
{ 
    return node; 
} 

你只能在类/结构体内引用一个没有参数列表的模板。


也当心通常这是一个坏主意,有在.cpp文件非专业的模板,因为这意味着人们将无法隐式实例化它们(不#include荷兰国际集团的.cpp)。

作为一个经验法则,只有专门的模板应该在.cpp。非专门的模板应该存在于.h中。

如果你知道自己在做什么,并计划手动实例化模板,那么通过一切手段将身体放在.cpp,但通常这不是人们做的事情。

+0

非常感谢彼得。问题解决了! – Mark 2012-01-19 06:34:49

0

返回类型不完整,它也需要模板参数。