[cfe-users] Invalid use of non-static member of struct nested inside of class template

Bobby Moretti via cfe-users cfe-users at lists.llvm.org
Mon Mar 7 15:44:23 PST 2016


Hi,

In clang 3.6.2, the following code results in a compilation error:

template <typename T=void>
class bar
{
public:
    struct foo
    {
        int array[10];
    };

    int baz()
    {
        return sizeof(foo::array);
    }
};

int main(void)
{
    bar<> b;
    return b.baz();
}

$ clang++ -std=c++11 nonstatic.cpp -o nonstatic
nonstatic.cpp:12:28: error: invalid use of non-static data member 'array'
        return sizeof(foo::array);
                      ~~~~~^~~~~
nonstatic.cpp:20:14: note: in instantiation of member function
'bar<void>::baz' requested here
    return b.baz();
             ^
1 error generated.


If `bar` is no longer a template (just remove the first line and the
angle brackets in `bar<> b;`), then the code compiles cleanly. I get
the same error in both clang 3.6.2 final and 3.8.0-svn257294-1~exp1.
The same code also compiles cleanly in gcc version 5.2.1.

It seems strange to me that this would result in an error, but I have
not yet tried to see what the standard says. Can anyone with confirm
whether this code should be valid or not?

Version details:

$ clang++ --version
Ubuntu clang version 3.6.2-1 (tags/RELEASE_362/final) (based on LLVM 3.6.2)
Target: x86_64-pc-linux-gnu
Thread model: posix


Thanks,
Bobby

-- 
Bobby Moretti
bobmoretti at gmail.com



More information about the cfe-users mailing list