使用可变模板的类成员函数继承

Class member function inheritance with variadic templates

本文关键字:成员 函数 继承      更新时间:2023-10-16

在以下代码中,Container的可变模板版本似乎没有继承Container的单一模板版本的名称函数,g++4.5.2抱怨道:

no matching function for call to ”Container<Variable1, Variable2>::name(Variable2)”
candidate is: std::string Container<First_Variable, Rest ...>::name(First_Variable) [with First_Variable = Variable1, Rest = {Variable2}, std::string = std::basic_string<char>]

代码:

#include "iostream"
#include "string"
using namespace std;
struct Variable1 {
    string operator()() {
        return string("var1");
    }
};
struct Variable2 {
    string operator()() {
        return string("var2");
    }
};
template<class... T> class Container;
template<class First_Variable, class... Rest>
class Container<First_Variable, Rest...> : public Container<Rest...> {
public:
    string name(First_Variable variable) {
        return variable();
    }
};
template<class Variable> class Container<Variable> {
public:
    string name(Variable variable) {
        return variable();
    }
};
int main(void) {
    Container<Variable1, Variable2> c;
    cout << "Variables in container: " << c.name(Variable1()) << ", " << c.name(Variable2()) << endl;
    return 0;
}

我做错了什么,或者这应该奏效吗?

name隐藏基类的名称。尝试

template<class... T> class Container;
template<class First_Variable, class... Rest>
class Container<First_Variable, Rest...> : public Container<Rest...> {
public:
    using Container<Rest...>::name;
    string name(First_Variable variable) {
        return variable();
    }
};
template<class Variable> class Container<Variable> {
public:
    string name(Variable variable) {
        return variable();
    }
};

如果你迂腐,那么你的局部专业化是不正确的。C++11规范项模糊了形式为<FixedParameter, Pack...><FixedParameter>的两个部分专门化。这一点曾被讨论过,许多人对此感到惊讶,因此有些编译器没有实现C++11的这一部分。