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



             Bug #: 56452

           Summary: [C++11] Using declaration for inheriting constructors

                    taints template parameter

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: lucdan...@free.fr





Created attachment 29537

  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=29537

Minimal reproducible testcase



$ g++-snapshot --version

g++-snapshot (Debian 20130222-1) 4.8.0 20130223 (experimental) [trunk revision

196236]



$ cat main.cpp 

struct foo {

    explicit foo(int) {}

};



template<typename T>

struct bar: T {

    using T::T;



    // Bad

    explicit bar(): T(0) {}



    void baz()

    {

        // Also bad

        using qux = T;

    }

};



int main()

{}



$ g++-snapshot -std=c++11 -pthread main.cpp 

main.cpp: In constructor 'bar<T>::bar()':

main.cpp:10:21: error: 'using T::T' is not a non-static data member of 'bar<T>'

     explicit bar(): T(0) {}

                     ^

main.cpp: In member function 'void bar<T>::baz()':

main.cpp:15:21: error: expected type-specifier before 'T'

         using qux = T;

                     ^



---



If the using declaration is commented out, then things proceed as usual. It is

also possible to alias the template parameter before the using declaration

(e.g. using base_type = T;) to substitute for uses of T after the declaration.

Because this doesn't happen if bar is not a template, I don't think it is

intended.

Reply via email to