简体   繁体   English

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

[英]Class member function inheritance with variadic templates

In the following code it seems that the variadic template version of Container doesn't inherit the name function of the single template version of Container, g++ 4.5.2 complains: 在以下代码中,容器的可变参数模板版本似乎没有继承容器的单个模板版本的名称功能,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>]

The code: 编码:

#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;
}

What am I doing wrong or is this even supposed to work? 我在做错什么,还是应该这样做?

The name are hiding the name of the base class. name隐藏了基类的名称。 Try 尝试

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();
    }
};

If you are pedantic, then your partial specializations are incorrect. 如果您是学徒,那么您的部分专业知识是不正确的。 The C++11 spec terms ambiguous two partial specializations of the form <FixedParameter, Pack...> and <FixedParameter> . C ++ 11规范术语含糊不清的两个部分专业化,形式为<FixedParameter, Pack...><FixedParameter> This was discussed and many people find it surprising, so some compilers do not implement that part of C++11. 对此进行了讨论,许多人感到惊讶,因此某些编译器未实现C ++ 11的这一部分。

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

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