闲来无事,重读一下《TCPL》,对其中的例子试验了一下:
#include <iostream> #include <fstream> #include <string> #include <vector> #include <algorithm> #include <iterator> using namespace std; int main() { string from, to; cin >> from >> to; ifstream is(from.c_str()); istream_iterator<string> ii(is); istream_iterator<string> eos(); // !here vector<string> b(ii, eos); sort(b.begin(), b.end()); ofstream os(to.c_str()); ostream_iterator<string> oo(os, "/n"); unique_copy(b.begin(), b.end(), oo); return !is.eof() || !os; }
其中的这行:
vector<string> b(ii, eos);
GCC给出了一段费解的错误:
D:/myproj/test/main.cpp|20|error: no matching function for call to 'std::vector<std::basic_string<char> >::vector(std::istream_iterator<std::basic_string<char> >&, std::istream_iterator<std::basic_string<char> > (&)())'| 用力的思考了一下,自信其中的ii和eos应该是合适的迭代器,应该可以匹配 vector<T>::vector(iterator beg, iterator end); // (注:伪代码) 形式的构造函数才是的! 经验告诉我,编译出现错误的地方并不一定是真正错误的地方。于是,再次审视前方代码: istream_iterator<string> eos (); // !here Ooops!看Gotchas的时候就听说过了,当时也理解了,到真正碰见,真是花了一番功夫才找到它。 改正就是那么简单: istream_iterator<string> eos; // !here