vsoftco
vsoftco

Reputation: 56557

Double template<> in template specialization

Why does the code below compile? I am not specializing a template member function of a template class, so only one template<> should be used. However, g++ compiles it with no warnings whatsoever, clang++ gives only a warning

warning: extraneous template parameter list in template specialization

template<typename T>
struct S{};

template<> template<> // why can we do this? 
struct S<int>{};

int main()
{

}

Upvotes: 9

Views: 1835

Answers (2)

David G
David G

Reputation: 96810

A bug report (filed as PR5559) from a much older version of clang discusses the issue as well. The problem is that gcc and clang both have discrepancies when it comes to whether multiple template declarations are valid during an explicit specialization. Quoth Gabor Greif:

The first error is actually none, clang correctly diagnoses that only one "template <>" is needed. But because g++ accepts this and several people (like me) may have the misconception that the number of "template <>"s is governed by nesting instead of the number of levels being specialized, it may be interesting to reduce the error to a warning and possibly emit a fixit hint.

The disparity could also be caused by the standard's cyclic definition of an explicit specilization (as noted by @user657267).

Upvotes: 2

user657267
user657267

Reputation: 21000

Because the grammar allows it, and there doesn't seem to be anything under the template specialization section that prohibits it:

From [gram.temp]

explicit-specialization:

template < > declaration

From [gram.dcl]

declaration:

[...]

explicit-specialization

The fact that the grammar is too lax has been in the active issues list (#293) since 2001.

Upvotes: 4

Related Questions