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

问题描述 投票:0回答:3

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

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

Visual Studio 2015 似乎允许这样做。 海湾合作委员会拒绝了。 我在 cppreference 页面上找不到任何内容。

c++ templates friend forward-declaration default-arguments
3个回答
3
投票

从 C++11 开始,规则在

14.1[temp.param]/9

中指定

如果友元函数模板声明指定了默认模板参数,则该声明应是定义,并且应是翻译单元中函数模板的唯一声明。

直到 C++11,当然,14.1/9 表示“默认模板参数不得在友元模板声明中指定。”

(上面的内容几乎是逐字复制的,由cppreference在默认模板参数,现在也在模板朋友提到)

因此,为了使您的程序有效 C++,请在类中定义您的友元模板,而不仅仅是声明。


2
投票

如果你真的想让你的函数 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;
}

0
投票

我的5美分:

如果您使用显式模板实例化,则可以使用辅助函数:

.h文件

class A{
    int value;
public:
    template<class T>
    friend void foo_(); // defined in the .cpp file...
};

template<class T = int>
void foo();             // defined in the .cpp file...

.cpp文件:

template<class T>
void foo_(){
   //...
}

template<class T>
void foo(){
   return foo_<T>();
}

template void foo<int>();
template void foo<float>();
template void foo<double>();

注意如何无法从客户端代码调用

foo_()
。客户将仅使用
foo()

© www.soinside.com 2019 - 2024. All rights reserved.