如何在C ++中初始化私有静态集?

时间:2018-10-27 20:47:41

标签: c++

我有一个私有set成员,带有以下标头声明

class foo
{
    private:
        static std::set<int> _mySet;
};

如何在源文件中使用_mySet?我试图初始化它,但是这些没用:

std::set<int> foo::_mySet{};  //  error: qualified-id in declaration before ‘{’ token
foo::_mySet = std::set<int>();  // error "...is private within this context"

1 个答案:

答案 0 :(得分:1)

这在VS2017 CE中可以正常编译

Foo.h

#pragma once

#include <set>

class Foo {
private:
    static std::set<int> mySet_;

public:
    Foo() = default;

    static std::set<int> getSet() {
        return mySet_;
    }

    static void addToSet( int val ) {
        mySet_.insert( val );
    }
};

Foo.cpp

#include "Foo.h"

std::set<int> Foo::mySet_{};

如果您尝试这样做:

static std::set<int> mySet_ = {};
// or
static std::set<int> mySet_{};

Visual Studio在头文件中建议a member with an in-class initializer must be const

因此,如果我们将其更改为const

static const std::set<int> mySet_ = {};
// or
static const std::set<int> mySet{};

Visual Studio抱怨a member of type "const std::set<int, std::less<int>, std::allocator<int>>" cannot have an in-class initializer

我希望这有助于阐明编译器如何解释这些声明-定义和初始化。