从虚拟类继承的类的显式特化

问题描述 投票:0回答:1

我有一个虚拟类

BASE
,和一个继承类
BOX_str
,它实现了虚拟函数

class BASE {
public:
    virtual ~BASE() {};

    virtual std::vector<int> custom_int() const = 0;

    virtual std::vector<double> custom_double() const = 0;
};

struct BOX_str final : public BASE {

    template <typename ...Args>
    BOX_str(Args... args) : base(std::forward<Args>(args)...) {}

    std::string base;

    std::vector<int> custom_int() const {
        return custom_vec<int>(base);
    }

    std::vector<double> custom_double() const {
        return custom_vec<double>(base);
    }

    template <typename NUM>
    std::vector<NUM> custom_vec(const std::string& s) const {
        return {32, 62};
    }
};

但是,除了

BOX_str
函数之外,所有
custom_vec()
类内容在类似类中都是通用的,

所以我尝试制作一个模板类

BOX

template <typename T>
struct BOX : public virtual BASE {

    template <typename ...Args>
    BOX(Args... args) : base(std::forward<Args>(args)...) {}

    T base;

    std::vector<int> custom_int() const {
        return custom_vec<int>(base);
    }

    std::vector<double> custom_double() const {
        return custom_vec<double>(base);
    }

    template <typename NUM>
    std::vector<NUM> custom_vec(const T&) const;
};

并将

custom_vec()
留待稍后为
BOX

的每个显式专业化实施
template <>
struct BOX<std::string> {
    template <typename NUM>
    std::vector<NUM> custom_vec(const std::string& s) const {
        return {42, 52};
    }
};

然后我尝试测试课程

int main() {
    std::string mystr{ "abcd" };

    BASE* v1 = static_cast<BASE*>(new BOX<std::string>(mystr));
    BASE* v2 = static_cast<BASE*>(new BOX_str(mystr));
}

v2
没有引发任何错误,但
v1
做了:
excess elements in struct initializer
,这意味着
BOX
的显式特化无法访问其构造函数,以及
BOX
的所有内容。

我很困惑,无法弄清楚如何正确实现

BOX
类,以便它像
BOX_str
一样工作,但以通用方式。希望得到一些帮助。

c++ virtual-functions c++-templates
1个回答
0
投票

您需要在您的专业领域中再次提供

BOX
类的完整定义,而不仅仅是
custom_vec()
函数:

template <>
struct BOX<std::string> : public virtual BASE {

    BOX(const std::string& s) : base(s) {}

    std::string base;

    std::vector<int> custom_int() const {
        return custom_vec<int>(base);
    }

    std::vector<double> custom_double() const {
        return custom_vec<double>(base);
    }

    template <typename NUM>
    std::vector<NUM> custom_vec(const std::string& s) const {
        return {42, 52};
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.