【发布时间】:2011-03-12 06:04:06
【问题描述】:
我有一堂课:
class foo {
private:
std::string data;
public:
foo &append(const char* str, size_t n) { data.append(str,n); }
// for debug output
template <typename T>
friend T& operator<< (T &out, foo const &f);
// some other stuff
};
template <typename T>
T& operator<< (T &out, foo const &f) {
return out << f.data;
}
我希望它适用于任何提供 << 运算符的类。
这适用于std::cout,如下所示:
std::cout << fooObject;
但以下失败:
BOOST_AUTO_TEST_CASE( foo_append_and_output_operator )
{
// fooObject is accessable here
const char* str = "hello";
fooObject.append(str, strlen(str));
output_test_stream output;
output << fooObject;
BOOST_CHECK( output.is_equal(str) );
}
g++ 告诉我:
In function ‘T& operator<<(T&, const foo&)
[with T = boost::test_tools::output_test_stream]’:
error: invalid initialization of reference of type
‘boost::test_tools::output_test_stream&’ from expression of type
‘std::basic_ostream<char, std::char_traits<char> >’
发生了什么事?
我在 Ubuntu 8.04 上使用 Boost 1.34.1。
【问题讨论】:
-
BOOST_AUTO_TEST_CASE 代码中的“foo”是什么——类名还是变量名?
-
@jon hanson:错字,看我的编辑。现在应该清楚了。
-
那绝对是正确的代码吗?上面代码中任何地方都没有出现的ostream是怎么出现在错误中的?
标签: c++ unit-testing templates boost