我有一个虚拟类
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
一样工作,但以通用方式。希望得到一些帮助。
您需要在您的专业领域中再次提供
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};
}
};