我有一个私有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"
答案 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
我希望这有助于阐明编译器如何解释这些声明-定义和初始化。