2015-01-18 16 views
5

Вы можете использовать ключевое слово template при получении имени шаблона из глобального пространства имен:Есть ли причина использовать «:: template»?

template <class T> void function_template(); 

template <class T> 
void h() 
{ 
    ::template function_template<T>(); 
} 

int main() { h<int>(); } 

Но этот код может скомпилировать без него. Каковы ситуации, в которых можно было бы это сделать?

+0

@KerrekSB Но 'function_template' является членом * глобального пространства имен *, и этот код может скомпилироваться без него. –

+0

О, извините, вы имеете в виду конкретно глобальную версию - неважно тогда. –

ответ

8

я могу думать об одном месте, но я не думаю, что это будет общее:

#include <iostream> 

// simpile function template 
template<class T> 
void function_template(T) 
{ 
    std::cout << __PRETTY_FUNCTION__ << '\n'; 
} 

// overload (NOT specialized) 
void function_template(int value) 
{ 
    std::cout << __PRETTY_FUNCTION__ << '\n'; 
} 

int main() 
{ 
    function_template(0);    // calls overload 
    ::function_template(0);    // calls overload 
    ::template function_template(0); // calls template, deduces T 
} 

Выход

void function_template(int) 
void function_template(int) 
void function_template(T) [T = int] 

Я собирался набить некоторые из этого в анонимном пространстве имен на самом деле приносят нетривиальный смысл в ::, но этого, кажется, достаточно, поэтому я его оставил.

+0

[temp.names]/p5 говорит: «Имя, предваряемое ключевым словом« template », должно быть * template-id * или имя должно ссылаться на шаблон класса». ':: template function_template' не является, поэтому он должен быть плохо сформирован. –

Смежные вопросы