模板类的友元功能

Friend funcitons of template classes

本文关键字:友元 功能      更新时间:2023-10-16

我想使用友元函数返回一个嵌套的类对象

template <typename T>
class X{
public:
    class Y{
    public:
        int y;
    }test;
public:
    X(){
        test.y=10;
    }
    template <typename U>
    friend Y fun(X<U>);
};

template <typename T>
X<T>::Y fun(X<T> x){
    return x.test;
}

但是我收到一个错误说

在"X

::Y"之前需要"类型名",因为"X"是依赖范围

怎么了?

您需要

按照错误所说的字面意思进行操作: 把typename放在X<T>::Y之前:

template <typename T>
typename X<T>::Y fun(X<T> x){
    return x.test;
}

因为X<T>::Y的含义取决于T,编译器一般不能知道X<T>::Y指的是类型名还是变量。在这种情况下,规则是,如果您希望它是类型名,则必须使用 typename 关键字明确表示。

你必须写

template <typename T>
typename X<T>::Y fun(X<T> x){
    return x.test;
}

Becouse Compliler 无法解析Y是归档还是类型。