【发布时间】:2016-03-23 22:23:57
【问题描述】:
我想通过非模板类专门化一个带有可变模板模板参数的模板类。请看下文。
// non-template base class
class BaseNoneTemplate {
public:
void print(void) {
std::cout << "BaseNoneTemplate" << std::endl;
}
};
// template base class
template <typename T>
class BaseTemplate {
public:
void print(void) {
std::cout << "BaseTemplate" << std::endl;
}
};
// primary template class
template <template <typename...> class T_Self, typename... T_Params>
class VariadicTemplate : public T_Self<T_Params...> {
public:
VariadicTemplate() = default;
virtual ~VariadicTemplate() = default;
void print(void) {
this->T_Self<T_Params...>::print();
}
};
// specialized class with a non-template class
// ********** This specialized class makes an error: see the error message at the end of this question ***********
template <>
class VariadicTemplate<BaseNoneTemplate> : public BaseNoneTemplate {
public:
VariadicTemplate() = default;
virtual ~VariadicTemplate() = default;
void print(void) {
this->BaseNoneTemplate::print();
}
};
// specialized class with an template class
// ***** This class is an ok example *****
template <typename T_Value>
class VariadicTemplate<BaseTemplate, T_Value> : public BaseTemplate<T_Value> {
public:
VariadicTemplate() = default;
virtual ~VariadicTemplate() = default;
void print(void) {
this->BaseTemplate<T_Value>::print();
}
};
void test_variadic_template(void) {
VariadicTemplate<BaseNoneTemplate> non_template;
VariadicTemplate<BaseTemplate, int> an_template;
non_template.print();
an_template.print();
}
在上面的代码中,我无法通过非模板类 BaseNoneTemplate 专门化具有可变模板模板参数的模板类。 有人知道如何使用非模板类对其进行专门化吗?
编译器的错误如下,
../template_template_variadic.hpp:44:40: error: type/value mismatch at argument 1 in template parameter list for ‘template<template<class ...> class T_Self, class ... T_Params> class VariadicTemplate’ class VariadicTemplate<BaseNoneTemplate> : public BaseNoneTemplate {
^
../template_template_variadic.hpp:44:40: note: expected a class template, got ‘BaseNoneTemplate’
非常感谢。
【问题讨论】: