你能在.hpp文件中重载全局运算符吗?

时间:2015-06-09 12:56:19

标签: c++ operator-overloading

我为+写了一个重载来添加两个vector<double>

vector<double> operator+(vector<double> v, vector<double> u)
{
    int n = (v.size()<u.size()) ? v.size() : u.size();
    vector<double> w;
    for (int j = 0; j<n; ++j)
        w.push_back(v[j] + u[j]);
    return w;
};

如果我输入.cpp文件就可以了。但是如果我输入.hpp文件,它会产生很多与“xutils”系统文件相关的错误。这是正常的吗?

3 个答案:

答案 0 :(得分:2)

如果要在头文件中定义全局函数,则必须使其成为内联函数。

inline vector<double> operator+(vector<double> v, vector<double> u)
{
   ...
}

然而,您可以在标头中声明,然后在一个cpp文件中定义它。

//x.hpp
vector<double> operator+(vector<double> v, vector<double> u);

//x.cpp
vector<double> operator+(vector<double> v, vector<double> u)
{
    int n = (v.size()<u.size()) ? v.size() : u.size();
    vector<double> w;
    for (int j = 0; j<n; ++j)
        w.push_back(v[j] + u[j]);
    return w;
} // No need for a semi colon here

答案 1 :(得分:2)

您不必定义全局operator+来添加两个std::vector STL有此功能。定义全局运算符可能会使事情变得混乱并导致冲突。您可以使用std::transform

std::vector<double> a {1.0, 2.0, 3.0, 4.0, 5.0};
std::vector<double> b {5.0, 4.0, 3.0, 2.0, 1.0};
std::vector<double> res(a.size());

std::transform(std::begin(a), std::end(a), std::begin(b), std::begin(res), std::plus<double>());

LIVE DEMO

答案 2 :(得分:0)

将原型更改为

inline vector<double> operator+(const vector<double>& v, const vector<double>& u)

inline允许将函数体写入标题。

通过常量引用传递参数对于编译是不必要的,但防止获取值副本,因此可以在不损失程序稳定性的情况下提高性能。

(在标题范围内有这样的函数是不明智的,因为它可能污染你的代码库。而且,实现看起来不正确:你没有在你的总和中包含更大的向量中的多余元素。)