我有一个与获取奇怪的问题。我已经使用std::vector
进行了typedef并且它包含一些自己的类:
typedef std::vector<data::WayPoint> TWayPointList;
这是一个嵌套在结构体DataHandler
中的类型,它存在于一些命名空间data
中。
现在,我想打印出向量的单个内容。为此,我的想法是重载& lt;<运算符并循环遍历typedef的向量的单个元素。因此,我在结构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有关,但我并没有理解重点。
那么,您有任何想法和建议让代码正常工作吗?
[编辑] 我已经添加了一些文件到源代码中,并提供错误输出以进行澄清。
data
和mkilib
吗? - Kerrek SB<<(ostream&, const WayPoint&)
? - Rudolf Mühlbauerdata
是一个命名空间,那么你的operator<<
定义必须放在该命名空间内部。 - ildjarn