具有默认模板参数的友元函数模板
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;
}
是否允许在友元声明中为模板参数提供默认值?
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;
}