可以在 class 中独立于 class' 模板制作 'using' 吗?

Can a 'using' be made in a class independent of the class' template?

如果我在 class 或结构中使用 typedefusing,有时我希望它独立于用于 class 或结构的模板.

在下面的示例中,我会使用 Object<T>::RefCountT,这会起作用,但在这种情况下我宁愿使用类似 Object::RefCountT 的东西,因为这样我就不必随意选择一个类型(阅读时可能会造成混淆)。

template <typename T>
struct Object {
    using RefCountT = unsigned short; // This is independent of T
};

对我来说,显而易见(但不理想)的解决方案是在 class 之外定义它,例如

using ObjectRefCountT = unsigned short;

我还尝试在没有模板的情况下进行重新定义,假设它们不会被认为是相同的,但这导致了关于重新定义的预期错误。

我假设因为它是一个 class 而不是函数,所以我不能隐式地执行它,编译器怎么知道它在这里无关紧要?

Object只是一个模板,但是你需要实例化它才能访问它的成员别名。我看到几个选项:

A) 不要让 RefCountT 成为 Object 的成员。

B) 提供一个默认参数,这样你就不需要明确选择一个类型来访问别名:

template <typename T = void>
struct Object {
    using RefCountT = unsigned short; // This is independent of T
};

然后

Object<>::RefCount x;

C) 对所有实例化使用公共基础class:

struct ObjectBase {
    using RefCountT = unsigned short;
};

template <typename T>
struct Object : ObjectBase {
    using ObjectBase::RefCountT;
};

然后

ObjectBase::RefCountT x;

一般来说,将不依赖于模板参数 T 的任何内容放在模板中可能是有益的。请注意,例如

template <>
struct Object<int> : ObjectBase {};

是一个特化,与Object的一般声明没有任何共同之处(即没有成员别名)。您将不得不重复专业化中的所有内容,除非您将其移至 ObjectBase。因此我会建议 A) 或 C).