gpt4 book ai didi

c++ - 非成员模板友元函数的默认参数值错误

转载 作者:行者123 更新时间:2023-12-01 14:47:09 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





The correct way to define default argument for a friend function in C++

(1 个回答)


去年关闭。




为什么下面的代码可以用 GCC 而不是用 Clang 编译?谁是对的,为什么?

class TF
{
private:
struct S
{
};

template <typename T> friend void F(T x, S s, int v = 5);
};

template <typename T>
void F(T x, TF::S s, int v)
{
}
我在使用 clang++ 时遇到以下错误:
    error: friend declaration specifying a default argument must be a definition
template <typename T> friend void F(T x, S s, int v = 5);
^
error: friend declaration specifying a default argument must be the only declaration
void F(T x, TF::S s, int v)
^
note: previous declaration is here
template <typename T> friend void F(T x, S s, int v = 5);
GCC 版本:g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Clang 版本:clang 版本 6.0.0-1ubuntu2
我该如何解决?

最佳答案

How do I resolve this?


正如错误消息所说,您必须定义函数模板才能具有默认参数:
    template <typename T>
friend void F(T x, S s, int v = 5) {
// ...
}
如果您不希望那样,您可以删除默认参数并添加一个充当代理的重载:
    template <typename T>
friend void F(T x, S s, int v);

// ...

template <typename T>
void F(T x, TF::S s, int v) {
// ...
}

template <typename T>
void F(T x, TF::S s) { F(x, s, 5); }
另一种选择是对函数进行前向声明:
template <typename T, typename S>
void F(T x, S s, int v = 5);

class TF {
private:
struct S {};

template <typename T, typename S>
friend void F(T x, S s, int v);
};

template <typename T, typename S>
void F(T x, S s, int v) {
static_assert(std::is_same_v<S, TF::S>);
// ...
}

关于c++ - 非成员模板友元函数的默认参数值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63296924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com