A template name has linkage (3.5). A non-member function template can have internal linkage; any other template name shall have external linkage. Entities generat
Just by reading carefully the quote you wrote you will notice that, except non-member function templates that might have internal linkage, all other templates have external linkage. There is no need to add keywords, nor keywords can be added there.
The description of what linkage means is in §3.5/2, in particular external linkage is defined as:
When a name has external linkage, the entity it denotes can be referred to by names from scopes of other translation units or from other scopes of the same translation unit.
To force internal linkage of a template non-member function you can use the static
keyword, but you cannot do the same with other templates:
template
static void foo( T ) {}
Note that you can achieve a somehow similar effect as internal linkage by using anonymous namespaces.
Internal linkage: §3.5/2
When a name has internal linkage, the entity it denotes can be referred to by names from other scopes in the same translation unit.
Note that the difference is that it cannot be referred from other translation units.
namespace {
template
class test {};
}
While the unnamed namespace does not make the linkage internal, it ensures that there will be no name collision as it will be in a unique namespace. This uniqueness guarantees that the code is not accessible from other translation units. Unnamed namespaces are considered to be a better alternative to the static
keyword §7.3.1.1/2
The use of the static keyword is deprecated when declaring objects in a namespace scope (see annex D); the unnamed-namespace provides a superior alternative
On the other hand, when you say that you:
know about external linkage using the keyword
extern "C"
You don't. extern "C"
is not a request for external linkage. Reread the spec. extern "C"
is a linkage-specification and instructs the compiler to use "C" style linkage within the block to interact with C code or libraries that already work that way, like dlopen
and family. This is described in §7.5