简体   繁体   中英

Different behavior of compilers - template template argument

Suppose i have the following code:

template <template <typename> class T>
class A {};

template <typename T>
class B
{
    A<B> instance;
};

int main()
{
   B<int> instance;
}

gcc 4.7.2 and gcc 4.8.0 compiles this code ok, while icc 13.0.1 and clang 3.2 gave me an error (clang require ::B instead of B, while icc also require whitespace after < in template instantiaion).

Who's right?

I found the thread about it ( Template class that refers to itself as a template template parameter? ), but i can't understand 14.6.1/2 of the standard and also saw LLVM bug 14350 ( http://www.mail-archive.com/llvmbugs@cs.uiuc.edu/msg21095.html ). So, clang and intel wrong here?

14.6.1 says:

The injected-class-name can be used as a template-name or a type-name . When it is used with a template-argument-list , as a template-argument for a template template-parameter , or as the final identifier in the elaborated-type-specifier of a friend class template declaration, it refers to the class template itself.

The "injected-class-name" is the name of the class template ( B ) "injected" into the scope of the class. In other words, it refers to the use of the unqualified name B within the definition of the class B . If you use that name in a context where a template name is required: ie, with explicit template arguments ( B<int> ) or as a template argument for a template which takes a template template parameter ( A<B> ), it should refer to the template itself.

So, gcc is right.

Also, in C++11, you should not need a space after the < in <::B> . According to section 2.5, paragraph 3, when dividing the input stream into tokens:

if the next three characters are <:: and the subsequent character is neither : nor > , the < is treated as a preprocessor token by itself and not as the first character of the alternative token <: . ( <: is another way of writing [ .)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM