双模板<>声明

时间:2011-10-17 13:08:34

标签: c++

有这样的功能定义:

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 ++下编译。

来源:TUT test framework

3 个答案:

答案 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的模板参数为intX<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>() 
{ 
}