项目场景:
命名空间域中VS报错"kv_test": 不是 “K” 的成员.
实际上, 我看了一下kv_test函数确实在K这个命名空间作用域中, 但是却报这个错误…有点懵比~
问题描述
疑惑很简单, 我这个函数明明在K这个空间域中为啥给我报错呢?
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
namespace K
{
template<class K>
struct BSTreeNode
{
K _val;
BSTreeNode<K>* _left;
BSTreeNode<K>* _right;
struct BSTreeNode(int k = 0)
:_val(k)
,_left(nullptr)
,_right(nullptr)
{}
};
template<class K>
struct BSTree
{
typedef struct BSTreeNode<K> Node;
private:
Node* _root = nullptr;
public:
bool Push(K x)
{
if (_root == nullptr)
{
_root = new Node(x);
return true;
}
Node* parent = _root;
// 这个地方初始值应该给多少呢? 首先我们已经排除了_root = nullptr的情况,
// 换句话说while循环一定会进去
//
Node* cur = _root;
while (cur)
{
if (cur->_val < x)
{
parent = cur;
cur = cur->_right;
}
else if (cur->_val > x)
{
parent = cur;
cur = cur->_left;
}
else
{
//重复~
return false;
}
}
//走到这里, 表示cur走到空了, 然后parent指向要插入位置的父亲.
Node* newnode = new Node(x);
if (parent->_val < x)
{
parent->_right = newnode;
}
else if(parent->_val > x)
{
parent->_left = newnode;
}
else
{
cout << "未知错误" << endl;
}
return true;
}//Push
bool Find(K x)
{
Node* cur = _root;
while (cur)
{
if (cur->_val == x)
{
return true;
}
else if (cur->_val < x)
{
cur = cur->_right;
}
else
{
cur = cur->_left;
}
}
return false;
}//Find
bool Pop(K x)
{
Node* cur = _root;
Node* parent = _root;
while (cur)
{
if ((cur->_val == 3) && (x == 3))
int b = 10;
if (cur->_val == x)
{
//这个地方我们准备删除了, 因为找到了~
//1.如果cur左为空 -> 让父亲去接管cur的右
if (cur->_left == nullptr)
{
//特殊情况, 假如说删除的就是根呢?
if (cur == _root)
{
//让根的右成为新的树
_root = _root->_right;
delete cur;
return true;
}
//这里需要判断cur是parent的左还是右...
if (parent->_left == cur)
{
parent->_left = cur->_right;
}
else
{
parent->_right = cur->_right;
}
delete cur;
}//1.如果cur左为空
//2.如果cur右为空 -> 让父亲去接管cur的左
else if (cur->_right == nullptr)
{
//特殊情况, 假如说删除的就是根呢?
if (cur == _root)
{
//让根的左成为新的树
_root = _root->_left;
delete cur;
return true;
}
//这里需要判断cur是parent的左还是右...
if (parent->_left == cur)
{
parent->_left = cur->_left;
}
else
{
parent->_right = cur->_left;
}
delete cur;
}//2.如果cur右为空
//3. 第三种情况, 就是cur左右都有孩子~
else
{
//3.1找到右子树中最大的结点
Node* MinCur = cur->_right;
Node* MinParent = cur;
while (MinCur->_left)
{
MinParent = MinCur;
MinCur = MinCur->_left;
}
//3.2交换
swap(MinCur->_val, cur->_val);
//3.3调整孩子...
if (MinParent->_left == MinCur)
{
MinParent->_left = MinCur->_right;
}
else if (MinParent->_right == MinCur)
{
MinParent->_right = MinCur->_right;
}
//3.4删除
delete MinCur;
}//3.cur左右都有孩子~
return true; //表示删除成功~
}
else if (cur->_val < x)
{
parent = cur;
cur = cur->_right;
}
else
{
parent = cur;
cur = cur->_left;
}
}
//如果这个结点压根就不存在, 肯定就不能删除咯~ 包括空树
return false;
}//Pop
void InOrder()
{
_InOrder(_root);
}
void _InOrder(Node* node)
{
if (node == nullptr)
{
cout << "N" << " ";
return;
}
_InOrder(node->_left);
cout << node->_val << " ";
_InOrder(node->_right);
}
};//BSTree
void k_test()
{
K::BSTree<int> tree;
tree.Push(1);
tree.Push(2);
tree.Push(3);
tree.Push(4);
tree.Push(5);
tree.Push(6);
cout << tree.Find(1) << endl;
cout << tree.Find(99) << endl;
cout << tree.Find(122) << endl;
cout << tree.Find(2) << endl;
int a[] = { 8, 3, 1, 10, 6, 4, 7, 14, 13 };
for (auto& e : a)
{
tree.Push(e);
tree.InOrder();
cout << endl;
}
for (auto& e : a)
{
tree.Pop(e);
cout << "pop: " << e << " ";
tree.InOrder();
cout << endl;
}
}
}
namespace KV
{
template<class K, class V>
struct BSTreeNode
{
K _val;
V _vue;
BSTreeNode<K, V>* _left;
BSTreeNode<K, V>* _right;
struct BSTreeNode(K k = K(), V v = V())
:_val(k)
, _vue(v)
, _left(nullptr)
, _right(nullptr)
{}
};
template<class K, class V>
struct BSTree
{
typedef struct BSTreeNode<K, V> Node;
private:
Node* _root = nullptr;
public:
bool Push(K x, V v)
{
if (_root == nullptr)
{
_root = new Node(x, v);
return true;
}
Node* parent = _root;
// 这个地方初始值应该给多少呢? 首先我们已经排除了_root = nullptr的情况,
// 换句话说while循环一定会进去
//
Node* cur = _root;
while (cur)
{
if (cur->_val < x)
{
parent = cur;
cur = cur->_right;
}
else if (cur->_val > x)
{
parent = cur;
cur = cur->_left;
}
else
{
//重复~
return false;
}
}
//走到这里, 表示cur走到空了, 然后parent指向要插入位置的父亲.
Node* newnode = new Node(x, v);
if (parent->_val < x)
{
parent->_right = newnode;
}
else if (parent->_val > x)
{
parent->_left = newnode;
}
else
{
cout << "未知错误" << endl;
}
return true;
}//Push
Node* Find(K x)
{
Node* cur = _root;
while (cur)
{
if (cur->_val == x)
{
return cur;
}
else if (cur->_val < x)
{
cur = cur->_right;
}
else
{
cur = cur->_left;
}
}
return nullptr;
}//Find
bool Pop(K x)
{
Node* cur = _root;
Node* parent = _root;
while (cur)
{
if ((cur->_val == 3) && (x == 3))
int b = 10;
if (cur->_val == x)
{
//这个地方我们准备删除了, 因为找到了~
//1.如果cur左为空 -> 让父亲去接管cur的右
if (cur->_left == nullptr)
{
//特殊情况, 假如说删除的就是根呢?
if (cur == _root)
{
//让根的右成为新的树
_root = _root->_right;
delete cur;
return true;
}
//这里需要判断cur是parent的左还是右...
if (parent->_left == cur)
{
parent->_left = cur->_right;
}
else
{
parent->_right = cur->_right;
}
delete cur;
}//1.如果cur左为空
//2.如果cur右为空 -> 让父亲去接管cur的左
else if (cur->_right == nullptr)
{
//特殊情况, 假如说删除的就是根呢?
if (cur == _root)
{
//让根的左成为新的树
_root = _root->_left;
delete cur;
return true;
}
//这里需要判断cur是parent的左还是右...
if (parent->_left == cur)
{
parent->_left = cur->_left;
}
else
{
parent->_right = cur->_left;
}
delete cur;
}//2.如果cur右为空
//3. 第三种情况, 就是cur左右都有孩子~
else
{
//3.1找到右子树中最大的结点
Node* MinCur = cur->_right;
Node* MinParent = cur;
while (MinCur->_left)
{
MinParent = MinCur;
MinCur = MinCur->_left;
}
//3.2交换
swap(MinCur->_val, cur->_val);
//3.3调整孩子...
if (MinParent->_left == MinCur)
{
MinParent->_left = MinCur->_right;
}
else if (MinParent->_right == MinCur)
{
MinParent->_right = MinCur->_right;
}
//3.4删除
delete MinCur;
}//3.cur左右都有孩子~
return true; //表示删除成功~
}
else if (cur->_val < x)
{
parent = cur;
cur = cur->_right;
}
else
{
parent = cur;
cur = cur->_left;
}
}
//如果这个结点压根就不存在, 肯定就不能删除咯~ 包括空树
return false;
}//Pop
void InOrder()
{
_InOrder(_root);
}
void _InOrder(Node* node)
{
if (node == nullptr)
{
cout << "N" << " ";
return;
}
_InOrder(node->_left);
cout << node->_val << " ";
_InOrder(node->_right);
}
};//BSTree
void K::kv_test()
{
int a[] = { 8, 3, 1, 10, 6, 4, 7, 14, 13 };
KV::BSTree<int, int> tree;
for (const auto& e : a)
{
tree.Push(e, e);
tree.InOrder();
cout << endl;
}
for (const auto& e : a)
{
KV::BSTreeNode<int, int>* find = tree.Find(e);
if (find)
{
cout << "k: " << find->_val << " and v: " << find->_vue << endl;
}
}
for (const auto& e : a)
{
tree.Pop(e);
tree.InOrder();
cout << endl;
}
}
}
#include"BinarySearchTree.h"
int main()
{
K::k_test();
KV::kv_test();
return 0;
}
原因分析:
定义在命名空间域中的函数前面多写了个"K::" …
解决方案:
去掉多写的"K::"即可~
EOF