【发布时间】:2023-03-23 02:02:02
【问题描述】:
我希望能够将任何std::vector<T> 的内容附加到输出流中。我找到了这段代码:
#ifndef DEBUG_H_
#define DEBUG_H_
#include <vector>
template < class T >
std::ostream& operator << (std::ostream& os, const std::vector<T>& v)
{
os << "[";
for (typename std::vector<T>::const_iterator ii = v.begin(); ii != v.end(); ++ii)
{
os << " " << *ii;
}
os << "]";
return os;
}
#endif /* DEBUG_H_ */
并放入标题Debug.h。如何在整个项目中使用此运算符?
编辑:我已经验证这在单元测试中有效:
#include "Debug.h"
TEST_F(AuxGTest, testVectorDebug) {
std::vector<int> vec(10, 42);
std::cout << "vec: " << vec << std::endl;
}
但是将它与 log4cxx 的日志语句一起使用是行不通的:
#include <log4cxx>
#include "Debug.h"
namespace Foo {
class Bar {
void foo() {
std::vector<int> vec(10, 42);
DEBUG("vec: " << vec);
}
}
}
这会产生以下编译器消息:
/usr/local/Cellar/log4cxx/0.10.0/include/log4cxx/helpers/messagebuffer.h:190:47: error: cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'
【问题讨论】:
-
大多数情况下,您只需在要使用运算符的源文件中包含标头,然后执行
std::cerr << your_vector;之类的操作 -
@JerryCoffin 如果代码在模板里试试,
T是基本类型之一,如int。 (它可能仍然适用于 MSVC,但不适用于实现 C++98 或更高版本的编译器。) -
@JamesKanze:我将这个问题解释为一个简单的问题,即如何部署此代码以在项目中使用,而不是更复杂的问题是如何实际使代码在任何情况下工作,但最琐碎的条件(但特别是在重读问题之后,我会公开承认这可能是一个错误)。