http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53549

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |fabien at gcc dot gnu.org

--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-06-12 
10:33:26 UTC ---
I *think* this is equivalent:

template<typename T>
class M
{
public:
    int operator()(unsigned);
};

template<typename T>
class C : public M<T>
{
public:
    using M<T>::operator();

    int operator()();


    template<int I>
        class F : public C<T>
        {
        public:

            using C<T>::operator();
        };

};

int main()
{
    C<int>::F<2> f;
    f();
}

using.cc: In instantiation of 'class C<int>::F<2>':
using.cc:29:18:   required from here
using.cc:14:9: error: 'int C<T>::operator()()' is inaccessible
     int operator()();
         ^
using.cc:18:15: error: within this context
         class F : public C<T>
               ^

There's only one "inaccesible" error because ther's only one operator()
overload in the reduced example, ading a const overload (as in the original)
gives two "inaccessible" errors.

This looks like another "using" issue, CC'ing Fabien.

N.B. Clang++ accepts the example above, but Comeau online rejects this because
C<T>::F uses C<T> before it is complete.  I think Comeau is correct.

Moving the definition of F to a point when C<T> is complete is acepted by
Comeau and Clang and older G++ versions but gives a different error with G++
trunk:

template<typename T>
class M
{
public:
    int operator()(unsigned);
};

template<typename T>
class C : public M<T>
{
public:
    using M<T>::operator();

    int operator()();

    template<int I> class F;

};

template<typename T>
template<int I>
    class C<T>::F : public C<T>
    {
    public:

        using C<T>::operator();
    };

int main()
{
    C<int>::F<2> f;
    f();
}

using.cc:26:30: error: no members matching 'C<T>::operator()' in 'class C<T>'
         using C<T>::operator();
                              ^

Reply via email to