是否有理由使用“::模板”?
Is there ever a reason to use "::template"?
从全局命名空间获取模板名称时,您可以使用 template
关键字:
template <class T> void function_template();
template <class T>
void h()
{
::template function_template<T>();
}
int main() { h<int>(); }
但是这段代码可以在没有它的情况下编译。在什么情况下可能需要这样做?
我能想到一个地方,但我认为它不太常见:
#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]
我打算将其中的一些内容填充到匿名命名空间中,以实际为 ::
带来重要意义,但这似乎已经足够了,所以我将其省略。
从全局命名空间获取模板名称时,您可以使用 template
关键字:
template <class T> void function_template();
template <class T>
void h()
{
::template function_template<T>();
}
int main() { h<int>(); }
但是这段代码可以在没有它的情况下编译。在什么情况下可能需要这样做?
我能想到一个地方,但我认为它不太常见:
#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]
我打算将其中的一些内容填充到匿名命名空间中,以实际为 ::
带来重要意义,但这似乎已经足够了,所以我将其省略。