如何在声明之外定义模板类的朋友模板函数?

spo*_*ang 1 c++ templates friend

如果我在模板类声明中定义了友元模板函数,如下所示,它可以编译.

#include <iostream>

template <typename T>
class X {
public:
    X(int i) : n(i) {}

private:
    T n;

    template <typename U> 
    friend void doStuff(const X<T>& x, const U& u)
    {
        std::cout << (x.n + u) << std::endl;
    }
};

int main()
{
    X<int> x(1);
    doStuff(x, 3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是如果我移出doStuff()类decalaration 的定义,就在声明类之后X<>,如下,它就无法编译.

template <typename U>
template <typename T>
void doStuff(const X<T>& x, const U& u)
{
    std::cout << (x.n + u) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

以下代码也不是.

template <typename U, typename T>
void doStuff(const X<T>& x, const U& u)
{
    std::cout << (x.n + u) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

那么如何doStuff()在类声明之外定义模板函数呢?

提前致谢.

jro*_*rok 5

也许是这样的:

template <typename T>
class X {
public:
    X(int i) : n(i) {}

private:
    T n;

    template <typename U, typename V>
    friend void doStuff(const X<U>& x, const V& u);
};

template <typename U, typename V>
void doStuff(const X<U>& x, const V& u)
{
    std::cout << (x.n + u) << std::endl;
}

int main()
{
    X<int> x(1);
    doStuff(x, 3);
    X<double> y(1.0);
    doStuff(y, 3.5);
}
Run Code Online (Sandbox Code Playgroud)

  • @wbb,它会..!那是因为模板参数推导会弄明白,并且基本上将参数的T设置为参数的U. 想象一下:你用一些X <Q>类型的对象调用doStuff.除了使用正确的Q还能做什么呢? (2认同)