gpt4 book ai didi

c++ - 如何定义在命名空间中的模板上声明的友元运算符?

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:12 26 4
gpt4 key购买 nike

我有这样一个类:

namespace N
{
template<unsigned Mantissa, unsigned Fraction>
class C
{
//...
public:
friend C<Mantissa, Fraction> operator +(const C<Mantissa, Fraction> & left, const C<Mantissa, Fraction> & right);
//...
};
}

我一直在尝试单独定义那个operator +,但我无法让它工作。

我试过:

    template<unsigned Mantissa, unsigned Fraction>
N::C<Mantissa, Fraction> N::operator+(const N::C<Mantissa, Fraction> & left, const N::C<Mantissa, Fraction> & right)
{
//...
}

但我得到“C2244 'operator +': 无法将函数定义与现有声明相匹配”

我试过:

    template<unsigned Mantissa, unsigned Fraction>
N::C<Mantissa, Fraction> operator+(const N::C<Mantissa, Fraction> & left, const N::C<Mantissa, Fraction> & right)
{
//...
}

但我收到链接器错误。

我试过:

namespace N
{
template<unsigned Mantissa, unsigned Fraction>
C<Mantissa, Fraction> operator+(const C<Mantissa, Fraction> & left, const C<Mantissa, Fraction> & right)
{
//...
}
}

但是我得到了同样的链接器错误。

我不知道问题是什么或如何解决。operator 必须是 friend 因为它正在访问一个 private 字段(我必须将该字段设置为 public 否则,如果可以避免,我不想这样做)。

最佳答案

operator+ 在类定义中被声明为非模板函数,但您稍后试图将其定义为函数模板,它们不匹配。如果你想把它做成一个函数模板,你可以

namespace N
{
// forward declaration of the class template
template<unsigned Mantissa, unsigned Fraction>
class C;
// forward declaration of the function template
template<unsigned Mantissa, unsigned Fraction>
C<Mantissa, Fraction> operator +(const C<Mantissa, Fraction> & left, const C<Mantissa, Fraction> & right);

template<unsigned Mantissa, unsigned Fraction>
class C
{
//...
public:
// the instantiation of operator+ with template parameter of current Mantissa and Fraction becomes friend
friend C<Mantissa, Fraction> operator + <>(const C<Mantissa, Fraction> & left, const C<Mantissa, Fraction> & right);
// ~~
//...
};
}

// definition of the function template
template<unsigned Mantissa, unsigned Fraction>
N::C<Mantissa, Fraction> N::operator+(const N::C<Mantissa, Fraction> & left, const N::C<Mantissa, Fraction> & right)
{
//...
}

如果你想让它成为一个非模板函数,那么只需在类定义中定义它:

namespace N
{
template<unsigned Mantissa, unsigned Fraction>
class C
{
//...
public:
// defined as non-template
friend C<Mantissa, Fraction> operator +(const C<Mantissa, Fraction> & left, const C<Mantissa, Fraction> & right) {
//...
}
//...
};
}

关于c++ - 如何定义在命名空间中的模板上声明的友元运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43720007/

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