我有一些问题让我感到奇怪。我已经 typedef'ed astd::vector
其中包含一些自己的类:
typedef std::vector<data::WayPoint> TWayPointList;
这是结构内部的嵌套类型,DataHandler
它在某些命名空间中具有抵抗力data
。
所以,现在我想打印出向量的单个内容。为此,我的想法是重载 << 运算符并循环遍历 typedef'ed 向量的单个元素。所以我在结构中声明了以下输出运算符DataHandler
:
namespace data
{
structure DataHandler
{
// ... some code
typedef std::vector<data::WayPoint> TWayPointList;
// ... some more code
/**
* @brief Globally overloaded output operator
*
* @param[in] arOutputStream Reference to output stream.
* @param[in] arWayPointList WayPoint which should be printed to output stream.
*/
LIB_EXPORTS friend std::ostream& operator<<(std::ostream& arOutputStream, const data::DataHandler::TWayPointList& arWayPointList);
} // structure DataHandler
} // namespace data
并在相应的源文件中定义它:
namespace data
{
std::ostream& operator<<(std::ostream& arOutputStream, const DataHandler::TWayPointList& arWayPointList)
{
for(DataHandler::TWayPointList::const_iterator lIterator = arWayPointList.begin(); lIterator < arWayPointList.end(); ++lIterator)
{
arOutputStream << *lIterator << std::endl;
}
return arOutputStream;
}
} // namespace data
这编译得很好。但是如果我添加这样的东西
int main(int argc, char *argv[])
{
// create Waypoint
data::WayPoint lWayPoint;
// create waypoint list
data::DataHandler::TWayPointList lWayPointList;
// append two elements
lWayPointList.push_back(lWayPoint);
lWayPointList.push_back(lWayPoint);
std::cout << lWayPointList << std::endl;
return 0;
}
在我testmain.cpp
的 中,编译器提到,它找不到正确的operator<<
(并做出很多假设,它找到了哪一个......包括我自己在其他类中定义的一些)。像这样的一些错误
src/main.cpp:107: error: no match for 'operator<<' in 'std::cout << lWayPointList'
src/main.cpp:107:18: note: candidates are:
... a long list of canditates...
我认为这与 ADL 有关,但我没有明白这一点。
那么,有什么想法和建议可以让代码正常工作吗?
[编辑] 我在源代码和错误输出中添加了一些文件以进行澄清。