【发布时间】:2021-02-16 19:45:01
【问题描述】:
我正在学习如何使用模板。假设,我有以下类结构。我仅将模板用于tC 和tD 类(打算在未来实现更多类似的类)。在项目的其他部分,我只使用基类A 中的方法进行抽象。这些类在 VS2019 中可以正确编译和运行。
我的问题是:
- 是否可以(根据准则和常识)在模板类中引用类型名 T 的成员? (我的意思是
getVersion()的实现) - 我可以指定类型名 T 需要有这样的成员吗?
struct version {
const char* name;
int date;
};
class A {
virtual void f() = 0;
virtual const version& getVersion() const = 0;
}
template <typename T>
class B : public A {
// some methods implementation specific for class B that require using typename T
void f() override; // implemented somewhere else
const version& getVersion() const { return T.v; }
}
class tC {
static constexpr version v{"tC", 1};
// some methods for C
}
class tD {
static constexpr version v{"tD", 2};
// some methods for D
}
【问题讨论】:
-
这里有几个问题可能会影响实际问题:类/结构声明未以
;结尾,基类A中没有虚拟析构函数,试图覆盖非虚拟函数在基类中,尝试声明不允许接收此修饰符的constexpr(至少对于 C++ -
这是一个最小的编译示例。不幸的是,它有效,这意味着我不知道最初的问题在问什么。 onlinegdb.com/raF_cbBwN 为了使其编译,我需要将 std::string 更改为字符数组,以便 constexpr 有效,并且我还将覆盖的函数在基础中设为虚拟,并将这些部分公开,以便它们可以成为看过,还有其他类似的事情。
-
是的,所有这些元素都在原始代码中。我笼统地概括了太多,对此感到抱歉。修改了代码。