先上代码 :
#ifndef AVLTREE_H
#define AVLTREE_H
template <typename T>
class AvlTree {
private:
AvlTree* leftChild;
AvlTree* rightChild;
int height;
T* element;
public:
AvlTree() :leftChild(0), rightChild(0), height(0), element(0) {}
AvlTree(T& item) :AvlTree() {
element = new T(item);
}
~AvlTree() {
delete element;
}
private:
friend int getHeight(AvlTree<T>*);
};
template <typename T>
int getHeight(AvlTree<T>* tree) {
return tree ? tree->height : -1;
}
#endif // !AVLTREE_H
#include <iostream>
#include <string>
#include "test.h"
int main(void) {
AvlTree<int>* x = NULL;
std::cout << getHeight(x) << std::endl;
}
报错信息 :
[zhangzhimin@ c++] $ g++ main.cpp --std=c++11
Undefined symbols for architecture x86_64:
"getHeight(AvlTree<int>*)", referenced from:
_main in main-fcb2cb.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
[zhangzhimin@ c++] $
我是想让 getHeight
这个函数成为模板类AvlTree
的友元, 要那种一对一的友元, 就比如AvlTree<int>
它只和getHeight(AvlTree<int>)
成为友元, 不知道这上面的代码为什么错了?
大家讲道理2017-04-17 14:40:10
类里面声明的是一个普通函数,但是类外面定义的是一个模板函数。
可以直接在类里面定义那个函数,注释掉外面的模板函数。类模板会给你生成一个getHeight.
friend int getHeight(AvlTree<T>* tree){
return tree ? tree->height : -1;
}
或者
private:
template <typename U>
friend int getHeight(AvlTree<U>* tree);//{
//return tree ? tree->height : -1;
// }
};
template <typename T>
int getHeight(AvlTree<T>* tree) {
return tree ? tree->height : -1;
}