如何定义嵌套在类声明之外的模板化类中的模板化类的方法的特化?

时间:2012-04-23 17:19:37

标签: c++ templates template-specialization

以下给出了一些编译错误:

error C2995: 'void A<T>::B<Q>::func(void)' : function template has already been defined
error C3855: 'A<T>::B<Q>': template parameter 'Q' is incompatible with the declaration

如果没有类声明中的定义,我怎么能这样做?

template<typename T>
struct A
{
    template<typename Q>
    struct B
    {
        void func();
    };
};

template<typename T>
template<typename Q>
void A<T>::B<Q>::func()
{
}

template<typename T>
template<>
void A<T>::B<int>::func()
{
}

编辑:

根据14.7.3§16,如果封闭类模板不是专用的,则嵌套类模板不能被专门化。但是,这让我想知道为什么嵌套类专门化在外部类声明中完全定义时如此工作:

template<typename T>
struct A
{
    template<typename Q>
    struct B
    {
        void func(){}
    };

    template<>
    struct B<int>
    {
        void func(){}
    };  
};

也许这只是VS2010允许我做一些我不应该做的事情?

1 个答案:

答案 0 :(得分:0)

问题在于,当您使用类(或结构)时,您需要能够声明模板化类型。

因此,如果你有一个模板化的嵌套类,它的类型需要在类本身中设置,因为你无法从“外部”那样做。
例如:

template<typename T>
struct A
{
    template<typename Q>
    struct B
    {
        void func(){}
    };
};

现在,假设您要声明A<int>类型的变量B<int> ...你会怎么做?

A<int>::B<int> a; //this syntactically would mean a is of type B<int>
A<int,int> a; //this would mean A is a templated class with 2 templated types

因此,您无法在声明中真正访问B 因此,B的类型必须在A类中设置。

<强> Nested Class Templates