c++ - 关于模板类的友元

浏览:43日期:2023-04-16

问题描述

先上代码 :

#ifndef AVLTREE_H#define AVLTREE_Htemplate <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++11Undefined symbols for architecture x86_64: 'getHeight(AvlTree<int>*)', referenced from: _main in main-fcb2cb.old: symbol(s) not found for architecture x86_64clang: error: linker command failed with exit code 1 (use -v to see invocation)[zhangzhimin@ c++] $

我是想让 getHeight 这个函数成为模板类AvlTree的友元, 要那种一对一的友元, 就比如AvlTree<int>它只和getHeight(AvlTree<int>)成为友元, 不知道这上面的代码为什么错了?

问题解答

回答1:

类里面声明的是一个普通函数,但是类外面定义的是一个模板函数。可以直接在类里面定义那个函数,注释掉外面的模板函数。类模板会给你生成一个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;}回答2:

那应该是这样子

private: template <typename X> friend int getHeight(AvlTree<X>*);回答3:

记得<exceptional c++ style> 一书中有一节专门讲这个问题

相关文章: