This code: template<typename T> class freeList { public: T* newNode() { return 0; } template<typename U> T* newNode(U u) { return newNode()->init(u); } template<typename U, typename V> T* newNode(U u, V v) { return newNode()->init(u, v); } };
class bar {}; class baz {}; class foo : public freeList<bar>, public freeList<baz> { }; int main() { foo f; bar* b = f.newNode<bar>(); } gets you: s3:~/ootbc/memspec$ g++ foo.cc foo.cc: In function int main(): foo.cc:17: error: request for member newNode is ambiguous foo.cc:8: error: candidates are: template<class U, class V> T* freeList::newNode(U, V) [with U = U, V = V, T = baz] foo.cc:6: error: candidates are: template<class U> T* freeList::newNode(U) [with U = U, T = baz] foo.cc:4: error: candidates are: T* freeList<T>::newNode() [with T = baz] foo.cc:8: error: template<class U, class V> T* freeList::newNode(U, V) [with U = U, V = V, T = bar] foo.cc:6: error: template<class U> T* freeList::newNode(U) [with U = U, T = bar] foo.cc:4: error: T* freeList<T>::newNode() [with T = bar] foo.cc:17: error: expected primary-expression before > token foo.cc:17: error: expected primary-expression before ) token -- Summary: confused compiler Product: gcc Version: 4.4.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: igodard at pacbell dot net http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42356