在下面的代码中,似乎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;
}
我做错了什么,或者这甚至应该有效?
答案 0 :(得分:2)
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的那部分。