初始化依赖于私有模板类型的静态类成员 (C++)

发布于 2024-08-31 22:08:06 字数 313 浏览 3 评论 0原文

我有以下情况:

class Test
{
private:
    class SubType
    {
    //...
    };
    static std::vector<SubType> v;
};

因为 v 是静态的,所以我在 cpp 文件中初始化它

std::vector<Test::SubType> Test::v;

但这不起作用,编译器告诉我“Test::SubType”是私有的。 对此我能做什么?

谢谢!

I have the following situation:

class Test
{
private:
    class SubType
    {
    //...
    };
    static std::vector<SubType> v;
};

Because v is static, I initialize it in the cpp file with

std::vector<Test::SubType> Test::v;

But this does not work, the compiler tells me that "Test::SubType" is private.
What can I do about this?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

醉南桥 2024-09-07 22:08:06

这对我有用:

#include <vector>
using namespace std;

class A {
    class B {
    };
    static  B b;
    static vector <B> vb;
};

A::B A::b;
vector <A::B> A::vb;

This works for me:

#include <vector>
using namespace std;

class A {
    class B {
    };
    static  B b;
    static vector <B> vb;
};

A::B A::b;
vector <A::B> A::vb;
下雨或天晴 2024-09-07 22:08:06

我猜你忘记了#include。因为以下内容在 comeau 上编译

#include <vector>
class Test { 
    class SubType 
    { 
    //... 
    }; 
    static std::vector<SubType> v; 
};
std::vector<Test::SubType> Test::v; 

I guess you forgot to #include <vector>. Because the following compiles on comeau

#include <vector>
class Test { 
    class SubType 
    { 
    //... 
    }; 
    static std::vector<SubType> v; 
};
std::vector<Test::SubType> Test::v; 
忆离笙 2024-09-07 22:08:06

其他人报告代码编译良好。我想提供支持它的标准措辞。 11/5

第 11 条中的所有访问控制都会影响从特定范围访问类成员名称的能力。对出现在成员的类定义之外的类成员的定义中使用的名称进行访问控制,就好像整个成员定义出现在成员的类的范围内一样。 <代码>[...]

[示例:

<前><代码>A类{
typedef int I; // 私有成员
如果();
朋友我g(I);
静态 I x;
};

A::IA::f() { 返回 0; }
A::I g(A::I p = A::x);
A::I g(A::I p) { 返回 0; }
A::IA::x = 0;

这里,A::I 的所有使用都是格式良好的,因为 A::fA::x 都是成员类 A 和 g 是类 A 的友元。这意味着,例如,必须推迟对第一次使用 A::I 的访问检查,直到确定这次使用 >A::I 是 A 类成员的返回类型。]

Others reported the code compiles fine. I want to supply the Standard wording for backing it up. At 11/5

All access controls in clause 11 affect the ability to access a class member name from a particular scope. The access control for names used in the definition of a class member that appears outside of the member’s class definition is done as if the entire member definition appeared in the scope of the member’s class. [...]

[Example:

class A {
  typedef int I; // private member
  I f();
  friend I g(I);
  static I x;
};

A::I A::f() { return 0; }
A::I g(A::I p = A::x);
A::I g(A::I p) { return 0; }
A::I A::x = 0;

Here, all the uses of A::I are well-formed because A::f and A::x are members of class A and g is a friend of class A. This implies, for example, that access checking on the first use of A::I must be deferred until it is determined that this use of A::I is as the return type of a member of class A. ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文