https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61936

            Bug ID: 61936
           Summary: gcc:g++ template template friends fail to compile.
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: modysk at hotmail dot com

In header view.h

    template<class S, template<typename> class V>
    void Operate(S c, const V<S>& vx);

    template<class T, template<typename> class U>
    class ViewBase
    {
        template<class S, template<typename> class V>
        friend void Operate(S c, const V<S>& vx);
    };

    template<class T>
    class ViewTypeA : public ViewBase<T, ViewTypeA>
    {
    };

    template<class T>
    class ViewTypeB : public ViewBase<T, ViewTypeB>
    {
    };

    template<class S, template<typename> class V>
    void Operate(S c, const V<S>& vx)
    {
    }

In main.cpp

    #include "view.h"

    int main(int argc, char **argv)
    {
        Operate(5, ViewTypeA<int>());
    }

gcc (compiling with -std=gnu++11) gives errors

main.cpp||In function ‘int main(int, char**)’:

main.cpp|7|error: call of overloaded ‘Operate(int, ViewTypeA<int>&)’ is
ambiguous

main.cpp|7|note: candidates are:

view.h|25|note: void Operate(S, const V<S>&) [with S = int; V = ViewTypeA]

view.h|9|note: void Operate(S, const V<S>&) [with S = int; V = ViewTypeA; T =
int; U = ViewTypeA]

The ambiguity seems to be based on the _class_ template parameters which should
not come into the picture at all for the user.

Reply via email to