繁体   English   中英

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

[英]Class member function inheritance with variadic templates

在以下代码中,容器的可变参数模板版本似乎没有继承容器的单个模板版本的名称功能,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的这一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM