相关疑难解决方法(0)

静态常量字符串(类成员)

我想为一个类(在这种情况下是一个形状工厂)有一个私有静态常量.

我想要有类似的东西.

class A {
   private:
      static const string RECTANGLE = "rectangle";
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我从C++(g ++)编译器中得到了各种错误,例如:

ISO C++禁止成员'RECTANGLE'的初始化

非整数类型'std :: string'的静态数据成员的无效类初始化

错误:使'RECTANGLE'静止

这告诉我这种成员设计不符合标准.如何在不使用#define指令的情况下拥有私有文字常量(或者可能是公共的)(我想避免数据全局性的丑陋!)

任何帮助表示赞赏.

c++ string static const class

429
推荐指数
8
解决办法
35万
查看次数

enum vs constexpr用于类中的实际静态常量

让我先说明我的意图.在旧的(C++)时代,我们会有如下代码:

class C
{
public:
  enum {SOME_VALUE=27};
};
Run Code Online (Sandbox Code Playgroud)

然后我们可以SOME_VALUE在整个代码中使用编译时常量,无论编译器在哪里看C::SOME_VALUE,它都只是插入文字27.

现在,将代码更改为以下内容似乎更为可接受:

class C
{
public:
  static constexpr int SOME_VALUE=27;
};
Run Code Online (Sandbox Code Playgroud)

这看起来更清晰,提供SOME_VALUE了一个定义良好的类型,并且似乎是C++ 11中的首选方法.(至少对我来说不可靠)问题是,这也导致SOME_VALUE需要在外部进行的情况.也就是说,在某个地方的某个cpp文件中,我们需要添加:

constexpr int C::SOME_VALUE; // Now C::SOME_VALUE has external linkage
Run Code Online (Sandbox Code Playgroud)

导致这种情况的情况似乎是在使用const引用时SOME_VALUE,这在C++标准库代码中经常发生(请参阅本问题底部的示例).顺便说一句,我使用gcc 4.7.2作为我的编译器.

由于这种困境,我被迫恢复定义SOME_VALUE为枚举(即旧学校),以避免必须为某些(但不是所有)静态constexpr成员变量的cpp文件添加定义.是不是有某种方法告诉编译器这constexpr int SOME_VALUE=27意味着SOME_VALUE应该将其视为编译时常量而不是具有外部链接的对象?如果您看到与它一起使用的const引用,请创建一个临时引用.如果你看到它的地址,如果需要的话就会产生编译时错误,因为它是编译时常量而已.

以下是一些看似良性的示例代码,它们使我们需要SOME_VALUE在cpp文件中添加定义(再次使用gcc 4.7.2进行测试):

#include <vector>

class C
{
public:
  static constexpr int SOME_VALUE=5;
};

int main()
{
  std::vector<int> iv;

  iv.push_back(C::SOME_VALUE); // Will cause an undefined reference …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr c++11

66
推荐指数
2
解决办法
1万
查看次数

如何在C++中初始化静态const成员?

是否可以在构造函数外部初始化静态const值?可以在找到成员声明的同一地点进行初始化吗?

class A {
private:
  static const int a = 4;
  /*...*/
};
Run Code Online (Sandbox Code Playgroud)

c++ static

61
推荐指数
4
解决办法
8万
查看次数

static const成员变量初始化

看起来我可以初始化一个POD静态const成员,但不是其他类型:

struct C {
  static const int a = 42;      // OK
  static const string b = "hi"; // compile error
};
Run Code Online (Sandbox Code Playgroud)

为什么?

c++ class static-members

9
推荐指数
3
解决办法
1万
查看次数

为什么可以初始化静态const变量内联而不是普通静态(C++)

如果我这样做的话

class Gone
{
    public:
    static const int a = 3;
}
Run Code Online (Sandbox Code Playgroud)

它有效,但如果有的话

class Gone
{
    public:
    static int a = 3;
}
Run Code Online (Sandbox Code Playgroud)

它给出了编译错误.现在我知道为什么第二个不起作用,我只是不知道为什么第一个这样做.

提前致谢.

c++

8
推荐指数
1
解决办法
7002
查看次数

在哪里定义模板类的静态const成员变量

根据这个问题的 答案:

According to the standards you must define i (这是一个静态const成员) outside of the class definition

...但是如果我为模板类的静态const成员变量执行此操作本身是通用的,那么我会得到链接错误(类似于在模板代码位于单独的编译单元中时获取链接错误).如果我在标题中定义它们,链接错误就会消失(我问是否可以generic这个问题的第一个位置定义它们).

我在做什么,安全吗?下面是标头中的静态const成员变量的定义之一.

  template<typename T, unsigned int T_Size> 
  const Vector<T, T_Size> Vector<T, T_Size>::Zero = Vector<T, T_Size>(0);
Run Code Online (Sandbox Code Playgroud)

c++ templates

3
推荐指数
1
解决办法
2521
查看次数

初始化一个静态const std :: pair <string,vector <string >>

我有一个

class myclass
{
    // ...
    static const vector<pair<string,vector<string>>> var;
    // ...
};
Run Code Online (Sandbox Code Playgroud)

在类定义中,使用单个字符串到其他几个字符串的映射.我使用vector <>而不是数组,以便能够添加映射对和映射长度,而不必使用大小变量.有没有办法在相应的.cpp文件中初始化变量,就像非复合类型的向量一样,即格式为:

 const vector<pair<string,vector<string>>> myclass :: var =
{
   ???
}
Run Code Online (Sandbox Code Playgroud)

或者我必须使用静态方法,如

static myclass::initStaticMembers(){...}
Run Code Online (Sandbox Code Playgroud)

如果有第一种方法可以做到这一点,那么语法是什么?我搜索过,但没有找到复合std :: pair初始化的语法.例如,你可以初始化一个vector<string>

vector <string>myvec={"elem1", "elem2","elem3"};
Run Code Online (Sandbox Code Playgroud)

但你怎么开始复杂的vector<pair<string,vector<string>>>?谢谢.

c++ initialization composite stdvector std-pair

-1
推荐指数
1
解决办法
2553
查看次数