扩展模板类以在对象<bool>实例</bool>上具有操作符bool

时间:2015-03-31 17:25:01

标签: c++ templates

我试图扩展模板以添加特定类型的函数。

这就是我现在所拥有的:

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'

我错过了什么?

3 个答案:

答案 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
    }
}