#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <sstream>
#include <iterator>
using namespace std;
template <typename Foo>
struct Gizmo
{
Foo mF;
Gizmo (Foo f) : mF (f) {};
template <template <typename> class Cont> void DoIt(
typename Cont <string>::iterator begin,
typename Cont <string>::iterator end)
const
{
stringstream ss;
ss << "(" << this->mF << ")\n";
const std::string s = ss.str();
copy (begin, end, ostream_iterator <std::string> (cout, s.c_str()));
}
};
int main()
{
list <string> l;
l.push_back ("Hello");
l.push_back ("world");
Gizmo <unsigned> g (42);
g.DoIt (l.begin(), l.end());
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxpdGVyYXRvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRm9vPgpzdHJ1Y3QgR2l6bW8KewoJRm9vIG1GOwoJR2l6bW8gKEZvbyBmKSA6IG1GIChmKSB7fTsKCQoJdGVtcGxhdGUgPHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgQ29udD4gdm9pZCBEb0l0KAoJCXR5cGVuYW1lIENvbnQgPHN0cmluZz46Oml0ZXJhdG9yIGJlZ2luLAoJCXR5cGVuYW1lIENvbnQgPHN0cmluZz46Oml0ZXJhdG9yIGVuZCkKCQljb25zdAoJCXsKCQkJc3RyaW5nc3RyZWFtIHNzOwoJCQlzcyA8PCAiKCIgPDwgdGhpcy0+bUYgPDwgIilcbiI7CgkJCWNvbnN0IHN0ZDo6c3RyaW5nIHMgPSBzcy5zdHIoKTsKCQkJY29weSAoYmVnaW4sIGVuZCwgb3N0cmVhbV9pdGVyYXRvciA8c3RkOjpzdHJpbmc+IChjb3V0LCBzLmNfc3RyKCkpKTsKCQl9Cn07CgppbnQgbWFpbigpCnsKCWxpc3QgPHN0cmluZz4gbDsKCWwucHVzaF9iYWNrICgiSGVsbG8iKTsKCWwucHVzaF9iYWNrICgid29ybGQiKTsKCQoJR2l6bW8gPHVuc2lnbmVkPiBnICg0Mik7CglnLkRvSXQgKGwuYmVnaW4oKSwgbC5lbmQoKSk7Cn0=
prog.cpp: In function ‘int main()’:
prog.cpp:35:28: error: no matching function for call to ‘Gizmo<unsigned int>::DoIt(std::list<std::basic_string<char> >::iterator, std::list<std::basic_string<char> >::iterator)’
g.DoIt (l.begin(), l.end());
^
prog.cpp:35:28: note: candidate is:
prog.cpp:16:49: note: template<template<class> class typedef Cont Cont> void Gizmo<Foo>::DoIt(typename Cont<std::basic_string<char> >::iterator, typename Cont<std::basic_string<char> >::iterator) const [with Cont = Cont; Foo = unsigned int]
template <template <typename> class Cont> void DoIt(
^
prog.cpp:16:49: note: template argument deduction/substitution failed:
prog.cpp:35:28: note: couldn't deduce template parameter ‘template<class> class typedef Cont Cont’
g.DoIt (l.begin(), l.end());
^