爲什麼下面的代碼會產生編譯錯誤?Google測試和運算符<< STL類型的過載
#include <iostream>
#include "gtest/gtest.h"
#include <utility>
namespace A {
//overloading operator << for std::pair
template<typename T1, typename T2>
std::ostream& operator<<(std::ostream& os, const std::pair<T1, T2>& p) {
return os << "pair:{" << p.first << ", " << p.second << "}";
}
struct C {
int x;
};
std::ostream& operator<<(std::ostream& os, const C& c) {
return os << c.x;
}
TEST(TestA, testA) {
std::pair<C, C> pair1;
std::pair<int, int> pair2;
EXPECT_EQ(0, 0) << pair1; //compiles
EXPECT_EQ(0, 0) << pair2; //doesn't compile
}
}
我使用Visual Studio 2015年錯誤的文字是:
錯誤C2679二進制「< <」:沒有操作員發現這需要右手 數類型常量性病的」 ::對'(或沒有可接受 轉換)... \ GTEST \ GTEST-message.h 131
如何變化的用戶定義的類型到內置型有差別?
Upd。感謝@Kerrek SB,解釋了錯誤。但是,現在還有另一個問題:我應該如何超載運算符< <的std::pair
才能夠像我的代碼一樣使用它?
因爲名稱空間查找不在命名空間'A'中查找您的運算符過載。 –
但是它發現它對'對'。爲什麼它只是沒有找到'對'? –
因爲模板和ADL。 'C'在命名空間'A'中,所以'A'是查找關聯的命名空間。 –