有这样的功能定义:
template<>
template<>
void object::test<1>()
{
}
双模板&lt;&gt;?
是什么意思?编辑:
我提取了对此示例有效的代码:
#include <iostream>
template <class U>
class A {
template <int n>
void test() {
}
};
template <class T>
class B {
public:
typedef A<T> object;
};
typedef B<int>::object object;
template<>
template<>
void object::test < 1 > () {
}
int main() {
return 0;
}
此代码在g ++下编译。
答案 0 :(得分:18)
例如,
template<class T = int> // Default T is int
class object<T> {
template<int R> void test ();
};
您的代码:
template<> // T is fixed
template<> // R is fixed
void object<>::test<1>() // T is default int, R is 1
{
}
相当于:
template<> // T is fixed
template<> // R is fixed
void object<int>::test<1>() // T is int, R is 1
{
}
答案 1 :(得分:3)
这是类模板成员函数模板的模板特化(我做对了吗?),带有模板的默认参数。看看这个:
template<typename T = int>
struct X {
template<typename U>
void foo(U u);
};
template<>
template<>
void X::foo(float f) { }
这为X
的模板参数为int
且X<int>::foo
的参数为float
的情况引入了专门化。这种情况与您的情况略有不同,我们不必在成员函数的名称之后显式提供模板参数,因为它可以推导出来。您的函数有一个非类型模板参数,无法推断出来,因此必须提供。
最让我困惑的是默认模板参数,我不确定使用跳过它是否是一个好习惯。我会为每一项专业提供它,以避免混淆。
答案 2 :(得分:2)
在我看来,这就像一个类模板中的函数模板的特化。例如,请考虑以下类模板定义:
template <int m=1>
class object
{
public:
template <int n>
void test();
};
// This differs from your example, by the addition of `<>` after `object`, but it's as
// close as I can come to valid code true to your example
template<>
template<>
void object<>::test<1>()
{
}