您收到的错误有点误导。当我尝试编译你的程序时,我不得不深入研究模板呕吐物,最后我得到了我认为发生的事情:
error: no match for 'operator<<' in '*((std::ostream_iterator<std::vector<std::basic_string<char> >, char, std::char_traits<char> >*)this)->std::ostream_iterator<std::vector<std::basic_string<char> >, char, std::char_traits<char> >::_M_stream << __value'
基本上,当您调用复制算法时,它使用输出迭代器,该迭代器使用命名空间 std 中的 的重载(因为那是 IT 所在的位置)。
因此,您需要做的是在名称空间 std 中为向量模板声明流运算符。将您的代码包围起来namespace std {}
看看会发生什么......
应该注意的是,您所做的基本上是修改 std::vector 并向其添加以前不存在的行为。这样做是非标准的、未定义的,并且很容易妨碍您。您可以考虑其他选择。
我错误地认为这是一个 koenig 查找的事情。事实并非如此,问题是名称隐藏,类似于这里的类中发生的情况,您在基类中声明了某些内容的重载(而不是覆盖)。
标准命名空间声明了几个“operator <<。本质上你所拥有的是这样的:
void fun(int);
namespace Test {
void fun() { fun(3); }
}
int main() {
Test::fun();
}
请注意,您可以使用fun(int)
来自全局命名空间或任何没有任何名为的函数的命名空间fun
在里面。您不能从Test
命名空间。
这就是为什么您使用全局声明的运算符 std命名空间。这std
命名空间已经具有与您尝试提供的重载名称相同的事物,因此该重载对其中的所有事物都隐藏std
。如果你可以放置一个 using 声明,事情就会有所不同。