模板类的朋友功能

时间:2017-03-29 09:20:35

标签: c++ templates

我想使用友元函数

返回一个嵌套的类对象
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'之前需要'typename',因为'X'是一个依赖范围

有什么问题?

2 个答案:

答案 0 :(得分:1)

您需要按字面意思执行错误所说的内容:在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,则必须使用typename关键字明确说明。

答案 1 :(得分:0)

你必须写

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

因为如果Y已归档或输入,则compouse程序无法解析。