说我有以下课程:
template<class T>
struct A
{
static int value;
};
template<class T>
int A<T>::value = 0;
我可以在没有问题的情况下专门针对具体类型A::value
:
struct B
{
};
template<>
int A<B>::value = 1;
我想在模板类型上专门化A :: value,我尝试了以下内容:
template<class T>
struct C
{
};
// error: template definition of non-template 'int A<C<T> >::value'
template<>
template<class T>
int A<C<T> >::value = 2;
有没有办法做到这一点,或者只能在非模板类型上专门化A ::值?
答案 0 :(得分:7)
您可以专门化初始化
,而不是引入整个显式专业化template<class T>
struct Value {
static int const value = 0;
};
template<class T>
struct Value< C<T> > {
static int const value = 2;
};
template<class T>
int A<T>::value = Value<T>::value;
答案 1 :(得分:2)
您可以通过C使用A的部分特化:
#include <iostream>
using namespace std;
template<class T>
struct A
{
static int value;
};
template<class T>
int A<T>::value = 0;
//(1) define the C template class first:
template<class T>
struct C
{
};
//(2) then define the partial specialization of A, in terms of C:
template<typename T>
struct A<C<T> >
{
static int value;
};
template<typename T>
int A<C<T> >::value = 2;
int main(void)
{
cout<<A<C<int> >::value<<endl;
cout<<"ok!"<<endl;
return 0;
}
答案 2 :(得分:0)
通过模板模板参数进行部分特化(参见上面的评论):
#include <iostream>
using namespace std;
template<class T>
struct A
{
static int value;
};
template<class T>
int A<T>::value = 0;
//solution 2:
//define a template-template argument partial specialization
//for any generic class U depending on a template argument,
//(which is a typename, in this case, but there's no reason why
//you wouldn't define specializations for non-types, etc.)
//this specialization has the advantage of not depending on
//the template definition of U (or C, etc.); in this case
//both T and U are free to vary, with the only constraint
//that U is parameterized by T:
template<typename T, template<typename> class U>
struct A<U<T> >
{
static int value;
};
template<typename T, template<typename> class U>
int A<U<T> >::value = 3;
//define the C template class, somewhere, where/when/if needed
//possibly in a different namespace, "module" (etc.)
template<class T>
struct C
{
};
int main(void)
{
cout<<A<C<int> >::value<<endl;//this now should print out: 3
cout<<"ok!"<<endl;
return 0;
}