c++ - 关于模板类的友元
高洛峰
高洛峰 2017-04-17 14:38:10
0
3
315

先上代码 :

#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>)成为友元, 不知道这上面的代码为什么错了?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(3)
大家讲道理

类里面声明的是一个普通函数,但是类外面定义的是一个模板函数。
可以直接在类里面定义那个函数,注释掉外面的模板函数。类模板会给你生成一个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;
}
いいねを押す +0
PHPzhong

那应该是这样子

private:
    template <typename X>
    friend int getHeight(AvlTree<X>*);
いいねを押す +0
迷茫

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート