Can't compile very simple snippet that uses boost::tuple
I am pretty sure it's because of my lack of skills with templates... Still, I don't understand why I can stream a vector if it's on its own, but not if it's stored in a boost::tuple. And it works with a std::pair! Any hint? #include <boost/tuple/tuple.hpp> #include <boost/tuple/tuple_io.hpp> #include <iostream> #include <vector> #include <algorithm> using namespace std; using namespace boost; template <typename T> ostream& operator<<(ostream& out, const vector<T>& v) { copy(v.begin(), v.end(), ostream_iterator<T>(out, " ")); return out; } template <typename T, typename U> ostream& operator<<(ostream& out, const pair<T, U>& p) { return out << p.first << " " << p.second; } int main(int, char**) { vector<float> v; cout << v; // Works fine pair<vector<float>, pair<int, int> > p; cout << p; // Works fine tuple<vector<float> > t; cout << t; // <== WON'T COMPILE } Thanks, Frank
On Sat, 27 Nov 2004 19:25:20 -0800, Frank Astier <fastier@yahoo.com> wrote:
I am pretty sure it's because of my lack of skills with templates... Still, I don't understand why I can stream a vector if it's on its own, but not if it's stored in a boost::tuple. And it works with a std::pair! Any hint?
int main(int, char**) { vector<float> v; cout << v; // Works fine
pair<vector<float>, pair<int, int> > p; cout << p; // Works fine
tuple<vector<float> > t; cout << t; // <== WON'T COMPILE }
Thanks,
Frank
I suspect it's because you need to define the operator<< for vector in the same namespace as vector (i.e. std) for the tuples operator<< to be able to find it. It's called 'argument dependent lookup'. Stuart Dootson
participants (2)
-
Frank Astier
-
Stuart Dootson