![](/img/trans.png)
[英]'Excess elements in struct initializer' error with C++11 uniform initialization
[英]C++11 uniform initialization: Field initializer is not constant
我正在嘗試實例化一組這樣的字符串:
class POI {
public:
...
static const std::set<std::string> TYPES { "restaurant", "education", "financial", "health", "culture", "other" };
...
}
現在,當我這樣做時,我得到了這些錯誤(全部都在這一行):
error: field initializer is not constant
static const std::set<std::string> TYPES { "restaurant", "education", "financial", "health", "culture", "other" };
error: in-class initialization of static data member 'const std::set<std::basic_string<char> > POI::TYPES' of non-literal type
error: non-constant in-class initialization invalid for static member 'POI::TYPES'
error: (an out of class initialization is required)
error: 'POI::TYPES' cannot be initialized by a non-constant expression when being declared
如果我假設集合中的字符串不被視為const,那對我的眼睛來說是有意義的。 這真的是問題嗎? 不幸的是,我找不到在初始化程序中將這些字符串聲明為const的方法。這可能嗎?
您必須在線外初始化靜態變量,如下所示:
#include <set>
#include <string>
class POI {
public:
static const std::set<std::string> TYPES;
};
const std::set<std::string> POI::TYPES { "restaurant", "education", "financial", "health", "culture", "other" };
這適用於標准規定的整數/枚舉類型(第9.4.2節:)
如果靜態數據成員是const integer或const枚舉類型,則它在類定義中的聲明可以指定一個常量初始化器,它應該是一個整型常量表達式。 在這種情況下,成員可以在其范圍內出現在整數常量表達式中。
C ++中的初始化程序應該是定義的一部分,而不是聲明的一部分。 對於const
積分和enum
類型,這是放寬的。 在C ++ 11中,為文字類型的 constexpr
成員添加了進一步的指令
[class.static.data] / P3
如果非易失性const靜態數據成員是整數或枚舉類型,則它在類定義中的聲明可以指定一個大括號或大小為初始化器,其中作為賦值表達式的每個initializer子句都是一個常量表達式(5.20) )。 可以使用constexpr說明符在類定義中聲明文字類型的靜態數據成員; 如果是這樣,它的聲明應指定一個大括號或等於初始化器,其中作為賦值表達式的每個initializer子句都是一個常量表達式。 [...]如果程序中使用了odr-used(3.2),並且名稱空間范圍定義不包含初始化程序,則仍應在名稱空間作用域中定義該成員
由於它不適用於您的情況,因此您應該將該靜態變量初始化為異常,如本例所示
class POI {
public:
static const std::set<std::string> TYPES;
};
const std::set<std::string> POI::TYPES = {
"restaurant", "education", "financial", "health", "culture", "other"
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.