如何在没有参数的情况下专门化模板类?

时间:2016-03-31 09:47:29

标签: c++ templates

我有这样的代码,但是编译器说错误(错误C2913:显式特化;' Vector'不是类模板的特化d:\ test_folder \ consoleapplication1 \ consoleapplication1 \ consoleapplication1.cpp 28 1 ConsoleApplication1 ):

#include <iostream>

template <int N, int ... T>
class Vector
{
public:
    static void print_arguments(void)
    {
        std::cout << N << " : " << std::endl;
        Vector<T>::print_argumetns();
    }
protected:
private:
};

template <>
class Vector<>
{
public:
    static void print_arguments(void)
    {
    }
protected:
private:
};

int main(void)
{
   std::cout << "Hello world" << std::endl;
   int i = 0;
   std::cin >> i;
   return 0;
}

2 个答案:

答案 0 :(得分:6)

您无法在没有模板参数的情况下创建Vector专精,因为Vector至少需要一个参数。

您可以做的是声明主模板采用任意数量的模板参数,然后将这两种情况定义为特化:

//primary template
template <int... Ns>
class Vector;

//this is now a specialization
template <int N, int ... T>
class Vector<N,T...>
{
    //...
};

template <>
class Vector<>
{
    //...
};

答案 1 :(得分:0)

你可能想要的是:

template <int N, int ... T>
class Vector
{
public:
    static void print_arguments(void)
    {
        std::cout << N << " : " << std::endl;
        Vector<T...>::print_arguments();
    }
protected:
private:
};

template <int N>
class Vector<N>
{
public:
    static void print_arguments(void)
    {
        std::cout << N << " : " << std::endl;
    }
protected:
private:
};

第二个是“终止”部分特化,仅在使用一个参数时使用。