具有默认模板参数的友元函数模板

friend function template with default template argument

是否允许在友元声明中为模板参数提供默认值?

class A {
    int value;
public:
    template<class T = int> friend void foo();
};

Visual Studio 2015年好像允许了。 gcc 拒绝它。我在 cppreference 页面上找不到任何内容。

从 C++11 开始,规则在 14.1[temp.param]/9

中指定

If a friend function template declaration specifies a default template-argument, that declaration shall be a definition and shall be the only declaration of the function template in the translation unit.

直到C++11,当然,14.1/9表示"A default template-argument shall not be specified in a friend template declaration."

(上面的内容几乎是逐字复制的,由 Default template parameters, now also mentioned at Template friends 的 cppreference)

因此,要使您的程序有效的 C++,请在 class 中定义您的友元模板,而不要只是声明。

如果你真的想让你的函数 foo() 保持全局,你可以试试这个:

class A
{
    int value;
public:
    template<class T> friend void foo();
};

template<class T = int> void foo()
{
    //you can use private member of A
    A foo;
    auto value = foo.value;
}