This question already has an answer here:
The correct way to define default argument for a friend function in C++

(1个答案)


4个月前关闭。




为什么下面的代码可以用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
lang版本:lang版本6.0.0-1ubuntu2
我该如何解决?

最佳答案


如错误消息所述,您必须定义函数模板才能具有默认参数:

    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++ - 非成员模板 friend 功能的默认参数值错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63296924/

10-12 20:14