I try to compile the following C++ code:
struct A {
    template< bool x >
    bool fun() {
        return x;
    }
};
template< typename T >
struct B {
    struct A2 {
        template< bool x >
        bool fun() {
            return x;
        }
    };
    void test() {
        A a;
        A2 a2;
        a.fun< true >();
        a2.fun< true >();
    }
};
The compiler complains that:
source_file.cpp: In member function ‘void B<T>::test()’:
source_file.cpp:22:24: error: expected primary-expression before ‘)’ token
         a2.fun< true >();
                        ^
However the line just above (a.fun< true >()) compiles just fine. Interestingly, if I remove the line template< typename T >, then compilation succeeds. However that line is required for reasons that do not appear from the minimal (not) working example. What is wrong here?