gpt4 book ai didi

c++ - 具有可变参数模板的类成员函数继承

转载 作者:行者123 更新时间:2023-11-28 03:40:36 25 4
gpt4 key购买 nike

在下面的代码中,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 的那部分内容。

关于c++ - 具有可变参数模板的类成员函数继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9399340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com