gpt4 book ai didi

c++ - 是否允许不可访问的类型作为模板参数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:52 24 4
gpt4 key购买 nike

假设我有一个带有一些重要元数据的模板类:

template <typename T> 
struct Metadata {
static const int ImportantInformation;
};

我有一个使用私有(private)内部类做一些工作的类:

class WorkDoer {
class Private;

public:
WorkDoer();
};

私有(private)内部类继承自Metadata:

class WorkDoer::Private : public Metadata<Private> {};

ImportantInformation 常量不是由编译器自动定义的,因此它需要位于顶级作用域的某个编译单元中,否则链接将失败:

template<> const int Metadata<WorkDoer::Private>::ImportantInformation = 0;

上面的语句在 visual studio 下编译,但 clang 提示 'Private' 是 WorkDoer 的私有(private)成员。哪个编译器运行正常,我该如何解决这个问题?

最佳答案

你不需要那个类外的定义,因为这个可以:

template<class T> const int Metadata::ImportantInformation=…;

与任何其他模板声明一样,这通常放在标题中。

您拥有的是 Metadata::ImportantInformation 的显式特化。看起来这个上下文应该 suppress access checking , 但 Clang 和 GCC 都不同意。 (这个主题的几个变体揭示了令人痛苦的实现分歧。)

关于c++ - 是否允许不可访问的类型作为模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57618757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com