2017-06-30 110 views
1

我使用的OpenCV的輸出流並我不喜歡的輸出中:C++重新定義現有的類

std::cout << matrix << std::endl;當基質具有類型cv::Mat

是否可以重新定義運算符<<對現有類的對象的影響,而無需修改類的代碼?

我知道我可以編寫一個簡單的函數,它會產生一個字符串出cv::Mat,但結果會更不可讀(我認爲),我是C++的初學者,所以我可能錯過了一些東西。

我發現this SO question所以我嘗試:

#include <iostream> 
#include <string> 
#include <opencv2/opencv.hpp> 

std::ostream& operator<<(std::ostream& os, const cv::Mat& mat) 
{ 
    os << "test"; 
    return os; 
} 

int main(int argc, char** argv) 
{ 
    cv::Mat m(2,2, CV_8UC3, cv::Scalar(0,0,255)); 
    std::cout << m << std::endl; 
} 

但我得到:

main.cpp:14:18: error: ambiguous overload for ‘operator<<’ in ‘std::cout << m’

編輯:我不認爲這是this question重複,因爲我沒有訪問該庫的代碼(OpenCV是開源的,所以我可以理論上修改它,但這是一個壞主意:更難以維護,重新分配我的代碼等)。

+0

如果該對象已定義你不能重新定義它非meber功能。 – NathanOliver

+0

[如何正確重載ostream的<<運算符?](https://stackoverflow.com/questions/476272/how-to-properly-overload-the-operator-for-an-ostream) – Javia1492

+0

@ Javia1492我已經添加了一個編輯來解釋爲什麼我認爲它不是重複的 –

回答

3

您不能用另一個替換過載。如果輸出操作符具有合適的掛鉤來改變輸出如何改變,那麼可能有機會以這種方式修改輸出。這個特定的輸出運算符是否有這樣一個鉤子,我不知道。

的合理可讀的解決辦法是創建一個簡單的包裝:

struct MatFormatter { 
    cv::Mat const& mat; 
}; 
std::ostream& operator<< (std::ostream& out, MatFormatter const& formatter) { 
    // format formatter.mat to your liking 
} 
MatFormatter format(cv::Mat const& mat) { 
    return MatFormatter{mat}; 
} 
// ... 
out << format(mat) << '\n'; 
0

cv::Mat已經有一個用戶定義的operator<<過載,可以不加另外一個自己,你就必須改變過載或添加某種功能,你想要它做的事情,只要它不是已經爲該類定義的運算符。