2015-06-09 30 views
2

我寫了一個過載+添加兩個vector<double>您可以重載.hpp文件中的全局運算符嗎?

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」系統文件相關的錯誤。這是正常的嗎?

+0

是如何與 「xutils」 系統文件錯誤? – user2079303

+0

在作用於內置類型的標準容器的標題中設置全局標準函數是很危險的。如果2個圖書館試圖做到這一點會怎樣? –

回答

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 
0

更改原型

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

inline允許在標題中寫入的功能體。

通過不斷引用傳遞的參數是不必要的編譯,但防止值拷貝被取,所以給你沒有程序的穩定性損失性能增益。如果在頭域有這樣的函數是不明智的,因爲它可能污染你的代碼庫。另外,實現看起來不正確:你沒有在你的總和中包含更大的向量中的多餘元素。

2

您不必定義全局operator+即可添加兩個std::vector s 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