Chinaunix

标题: 模板类问题 [打印本页]

作者: illidanee    时间: 2014-12-18 09:43
标题: 模板类问题
1.GetRoot() 方法报错信息如下。

1>------ Build started: Project: Demo, Configuration: Debug Win32 ------
1>  main.cpp
1>c:\users\administrator\desktop\demo\demo\binarysearchtree.h(41): error C2143: syntax error : missing ';' before '*'
1>c:\users\administrator\desktop\demo\demo\binarysearchtree.h(41): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\administrator\desktop\demo\demo\binarysearchtree.h(41): error C2065: 'Key' : undeclared identifier
1>c:\users\administrator\desktop\demo\demo\binarysearchtree.h(41): error C2065: 'Val' : undeclared identifier
1>c:\users\administrator\desktop\demo\demo\binarysearchtree.h(41): error C2923: 'IBSTree' : 'Key' is not a valid template type argument for parameter 'Key'
1>c:\users\administrator\desktop\demo\demo\binarysearchtree.h(41): error C2923: 'IBSTree' : 'Val' is not a valid template type argument for parameter 'Val'


个人觉得是找不到Node的定义,但是如果是函数参数中Node就不会报错。请高手指点。说明具体原因和修改方法。
多谢。

上代码。
  1. #ifndef _BINARY_SEARCH_TREE_H_
  2. #define _BINARY_SEARCH_TREE_H_

  3. template <typename Key, typename Val>
  4. class IBSTree
  5. {
  6. private:
  7.         struct Node
  8.         {
  9.                 Key k;
  10.                 Val v;
  11.                 Node *parent;
  12.                 Node *left;
  13.                 Node *right;
  14.         };
  15.         Node *m_pRoot;

  16.         typedef int (*TCmpFunc)(Key k1, Key k2);
  17.         TCmpFunc m_pCmpFunc;


  18. public:
  19.         IBSTree();
  20.         ~IBSTree();
  21.        
  22.         Node *GetRoot();
  23. };


  24. template <typename Key, typename Val>
  25. Node *IBSTree<Key, Val>::GetRoot()
  26. {
  27.         return m_pRoot;
  28. }

  29. template <typename Key, typename Val>
  30. IBSTree<Key, Val>::IBSTree()
  31. {
  32.         m_pRoot = NULL;
  33.         m_pCmpFunc = NULL;
  34. }

  35. template <typename Key, typename Val>
  36. IBSTree<Key, Val>::~IBSTree()
  37. {
  38.         m_pRoot = NULL;
  39.         m_pCmpFunc = NULL;
  40. }

  41. #endif
复制代码

作者: bruceteen    时间: 2014-12-18 10:18
Node *IBSTree<Key, Val>::GetRoot()
改为
typename IBSTree<Key,Val>::Node* IBSTree<Key, Val>::GetRoot()
作者: illidanee    时间: 2014-12-18 14:20
回复 2# bruceteen


多谢。 但是还有一点疑问为什么如果这么写就不需要在Node前面加 typename IBSTree<Key, Val>::  了呢。


代码如下
  1. template <typename Key, typename Val>
  2. int IBSTree<Key, Val>::GetRoot(Node *pNode)
  3. {
  4.         pNode = m_pRoot;
  5. }
复制代码

作者: myworkstation    时间: 2014-12-18 16:37
回复 3# illidanee

因为作为参数将使的ADL(Argument-dependent lookup)起作用,自动包含了类型所在的名字空间,而作为函数返回值的话就需要明确其符号名称的范围了。
   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2