【问题标题】:Initializing a static class member that depends on a private template type (C++)初始化依赖于私有模板类型的静态类成员 (C++)
【发布时间】:2011-02-17 00:14:04
【问题描述】:

我有以下情况:

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

因为v是静态的,所以我在cpp文件中用

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

但这不起作用,编译器告诉我“Test::SubType”是私有的。 我该怎么办?

谢谢!

【问题讨论】:

  • 在什么情况下?在文件范围内,这应该没问题。
  • 确实,我们可能需要更多代码。
  • 它在我的系统上编译得很好......哪个编译器?
  • 你能发布更多代码吗?那个 sn-p 对我有用 g++。

标签: c++ templates static private


【解决方案1】:

我猜你忘了#include &lt;vector&gt;。因为下面是在comeau上编译的

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

【讨论】:

    【解决方案2】:

    这对我有用:

    #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;
    

    【讨论】:

      【解决方案3】:

      其他人报告代码编译正常。我想提供标准措辞来支持它。在11/5

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

      [示例:

      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;
      

      这里,A::I 的所有用法都是合式的,因为 A::fA::x 是类 A 的成员,而 g 是类 A 的朋友。例如,这意味着在第一个A::I 的使用必须推迟到确定 A::I 的这种使用是作为类 A 成员的返回类型。]

      【讨论】:

        猜你喜欢
        • 2021-10-21
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-14
        • 1970-01-01
        相关资源
        最近更新 更多