我试图扩展模板以添加特定类型的函数。
这就是我现在所拥有的:
template<typename T> class Item {
public:
T value;
}
我想这样做Item<bool>
有一个operator bool()
,就像这样:
template<> class Item<bool> : public Item<bool>{
public:
explicit operator bool() const {
return this->value; // error
}
}
但是,我收到错误class 'Item<bool>' has no member 'value'
。
我错过了什么?
答案 0 :(得分:4)
您无法通过在类型特化上引入任意成员函数声明来扩展模板类声明。
您需要在原始类声明中出现该运算符声明:
template<typename T> class Item {
public:
T value;
operator bool() const {
std::static_assert
( !std::is_same<T,bool>
, "bool conversion is not available for this template parameter type."
);
}
}; // <<< Note the semicolon BTW
并专门化:
template<>
Item<bool>::operator bool() const {
return value;
}
std::static_assert()
会阻止任何代码编译,除了您自己的专业外,您不希望实例化有意义。
答案 1 :(得分:2)
专业类无效,它源于自身。如果要在模板类的每个特化中包含一些代码,则需要以不同的方式编写:
template<typename T> class ItemBase {
public:
T value;
}
template<typename T> class Item {
// generic implementation here
}
template<> class Item<bool> : public ItemBase<bool> {
public:
explicit operator bool() const {
return this->value;
}
}
答案 2 :(得分:0)
你不能让一个类继承自己。您可能正在尝试模拟您习惯使用其他语言的类的开放性,例如。蟒蛇。但是,C ++类没有打开 - 在定义它们之后无法添加它们的实现。对于模板类,这意味着明确专门为您的特定情况定义。是的,如果您没有正确设计类层次结构,这确实需要重复代码。
template<> class Item<bool>
{
public:
bool value;
explicit operator bool() const {
return this->value; // error
}
}