C ++中具有非类型参数的部分特定模板类

时间:2014-03-13 21:48:44

标签: c++ partial-specialization non-type

在下面的代码中,我收到了编译错误

#include <iostream>

using namespace std;

template <typename T, int I>
class MyClass {
public:
    void func1(){
    cout<<"default: func1"<<endl;
    }
    void func2(){
    cout<<"default: func2"<<endl;
    }
private:
    T haha;
};

template <typename T>
void MyClass<T, 1>::func1(){
    cout<<"special: func1"<<endl;
};



int main()
{
    MyClass<int, 2> intclass;
    intclass.func1();
    intclass.func2();

    MyClass<double, 1> doubleclass;
    doubleclass.func1();
    doubleclass.func2();
    return 0;
}

我收到了以下编译错误:

partialspecifizednontype.cpp:19: error: invalid use of incomplete type 'class MyClass<T, 1>'
partialspecifizednontype.cpp:6: error: declaration of 'class MyClass<T, 1>'

我无法做到这一点的任何具体原因?有没有解决方法来实现这个目标?

我注意到如果我的模板类没有第一个参数就可以了。 (我的gcc是4.2.1)

以下示例正常:

#include <iostream>

using namespace std;

template <int I>
class MyClass {
public:
    void func1(){
    cout<<"default: func1"<<endl;
    }
    void func2(){
    cout<<"default: func2"<<endl;
    }
};

template<>
void MyClass<1>::func1(){
    cout<<"special: func1"<<endl;
};



int main()
{
    MyClass<2> intclass;
    intclass.func1();
    intclass.func2();

    MyClass<1> doubleclass;
    doubleclass.func1();
    doubleclass.func2();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

类模板的成员函数本身也是函数模板。这意味着您可以明确地对它们进行专门化(就像在第二个示例中那样),但是功能模板不能部分专门化(正如您在第一个示例中所尝试的那样)。

作为一种解决方法,您可以部分地专门化整个班级:

template <typename T>
class MyClass<T, 1>
{
public:
    void func1() { cout << "special: func1" << endl; };
    // ...
};

您可能需要重构代码以将公共代码放入基类中以使此方法可维护。