[Bug c++/28317] New: template function returning nested class fails to compile when defined outside of its class

debian-gcc at lists dot debian dot org gcc-bugzilla@gcc.gnu.org
Sat Jul 8 17:55:00 GMT 2006


[forwarded from http://bugs.debian.org/373909]

Rechecked with 4.1.2 20060630 and 4.2.0

    The following code generates the g++ compiler error:

        14: error: expected constructor, destructor, or type  conversion
            before Outer

    template <typename T>
    class Outer
    {
        public:
            class Inner
            {
            };

        Inner get() const;
    };

    template <typename T>
    Outer<T>::Inner
    Outer<T>::get() const       // <-- this is line 14
    {
        return Inner();
    }

If the function get() is placed inside the template class Outer, no error is
reported. E.g.,

    template <typename T>
    class Outer
    {
        public:
            class Inner
            {
            };

        Inner get() const
        {
            return Inner();
        }
    };

An external definition compiles well if the class Inner is explicitly defined
as a template class (even though no template parameters are required). E.g., 

    template <typename T>
    class Outer
    {
        public:
            template <typename U>
            class Inner
            {
            };

        Inner<T> get() const;
    };


    template <typename T>
    Outer<T>::Inner<T>
    Outer<T>::get() const
    {
        return Inner<T>();
    }


Moreover, the first source, producing a compilation error with g++ was also
offered to the intel C++ compiler, where it compiled flawlessly. Here is a
transcript of the issued commands, illustrating the difference:


arnold@rc-429:~/programming/C++$ g++ -c -Wall demo1.cxx
demo1.cxx:14: error: expected constructor, destructor, or type
conversion before ?Outer?
arnold@rc-429:~/programming/C++$ icc -c -Wall demo1.cxx
arnold@rc-429:~/programming/C++$


My considerations for filing a bug report were:
    * g++ produces a compilation error where icc doesn't;
    * g++'s compilation error is only produced when the template function is
        defined outside of its template class;
    * the reported error message is rather cryptic, given the nature of the
        source, suggesting confusion on the part of the compiler.

Of course, g++ might offer a more rigid implementation of the C++ standard at
this point. However, I couldn't find a clear indication that the external
function implementation violates the standard. Hence the bug report.


-- 
           Summary: template function returning nested class fails to
                    compile when defined outside of its class
           Product: gcc
           Version: 4.1.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: debian-gcc at lists dot debian dot org


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



More information about the Gcc-bugs mailing list