Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在不同命名空间中使用模板_C++_Templates_Namespaces - Fatal编程技术网

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)