C++ 在不同命名空间中使用模板
我不确定确切的问题,但以下代码:C++ 在不同命名空间中使用模板,c++,templates,namespaces,C++,Templates,Namespaces,我不确定确切的问题,但以下代码: template<class T> inline std::ostream& operator <<(std::ostream& ss, std::vector<T> const& vec) { auto it(begin(vec)); if (it != end(vec)) ss << *(it++); for (; it != end(vec);
template<class T>
inline std::ostream& operator <<(std::ostream& ss, std::vector<T> const& vec)
{
auto it(begin(vec));
if (it != end(vec))
ss << *(it++);
for (; it != end(vec); ++it)
ss << " " << *it;
return ss;
}
模板
内联标准::ostream&operator两种解决方案:
inline std::ostream& operator <<(std::ostream& ss, MyClass const& in)
{
using ::operator<<;
return ss << "ClassVec: " << in.m_vec;
}
inline std::ostream& operator <<(std::ostream& ss, MyClass const& in)
{
ss << "ClassVec: ";
::operator<<(ss, in.m_vec);
return ss;
}
从您发表的评论中,我看到了以下解决方案:
#include <iostream>
#include <vector>
template<class T>
inline std::ostream& operator <<(std::ostream& ss, std::vector<T> const& vec)
{
auto it(begin(vec));
if (it != end(vec))
ss << *(it++);
for (; it != end(vec); ++it)
ss << " " << *it;
return ss;
}
namespace foo {
struct MyClass
{
std::vector<int> m_vec;
};
using ::operator<<;
inline std::ostream& operator <<(std::ostream& ss, MyClass const& in)
{
return ss << "ClassVec: " << in.m_vec;
}
}
int main() {
foo::MyClass test;
test.m_vec = {1,2,3};
std::cout << test;
}
在命名空间中,foo
正在隐藏::operatorADL无法找到它,除非它位于std
中,这是非法的。实际上,它可能已经是非法的。@KerrekSB:我不确定我是否理解正确,但当我将它放在全局名称空间中时,仍然找不到它。@Cookie、@Cookie:@Cookie,调用运算符或者使用::运算符添加您自己的不完整问题的不完整答案?我应该没有回答吗?缺少什么?从问题中,您缺少一个完整的代码来重现问题,因此三个人不得不猜测。完整的代码仅在注释内的链接中跟随。对于答案,您仍然缺少两个“解决方案”不在名称空间中,并且没有测试用例。
#include <iostream>
#include <vector>
template<class T>
inline std::ostream& operator <<(std::ostream& ss, std::vector<T> const& vec)
{
auto it(begin(vec));
if (it != end(vec))
ss << *(it++);
for (; it != end(vec); ++it)
ss << " " << *it;
return ss;
}
namespace foo {
struct MyClass
{
std::vector<int> m_vec;
};
using ::operator<<;
inline std::ostream& operator <<(std::ostream& ss, MyClass const& in)
{
return ss << "ClassVec: " << in.m_vec;
}
}
int main() {
foo::MyClass test;
test.m_vec = {1,2,3};
std::cout << test;
}
using ::operator<<;
std::ostream& operator <<(std::ostream& ss, MyClass const& in)