c2797未实现成员初始值设定项列表或非静态数据成员初始化程序内的列表初始化

时间:2015-01-22 09:01:07

标签: c++ visual-studio c++11 initializer-list

当我尝试编译项目时,我在visual studio 2013中收到以下错误。

c2797:成员初始化列表中的列表初始化或未实现的非静态数据成员初始化

以下是抛出上述编译器错误的代码段。

==== sample.h ====

enum class Process
{


  TUNNEL_IP_VERSION,  // Tunnel::IPVersion::Type
  PADDING_BYTE,
  IP_ADDRESS_FIT_ACTUAL_SIZE,
  IP_ADDRESS_FIT_IPv6_SIZE,
  PORT_NUMBER,
};

using ProcessingOrder = std::vector<Process>;

const ProcessingOrder m_ProcessingOrder =
{


  Process::TUNNEL_IP_VERSION,
  Process::PADDING_BYTE,
  Process::IP_ADDRESS_FIT_IPv6_SIZE,
  Process::PORT_NUMBER
};

尽管VS2013支持c ++ 11功能 - 初始化列表,为什么它会通过上述错误!如何摆脱这种情况?我需要在代码中更改什么才能解决此问题?

感谢您的回答。这很好用。 以下声明我也有类似的情况。

m_Attribute{SSL_CTX_new(g_SSLChoice[version].m_pfSSLMethod()), 0, 0}
  {

其中, m_Attribute 是,

struct{
         SSL_CTX* const m_pContext;
         Socket* m_pSocket;
         X509* m_pCertificate;
         }m_Attribute;

SSL_CTX_new是ssl.have中的标准定义 g_SSLChoice是,

g_SSLChoice[CloudSSL::TLSv1_2 + 1] =
  {
    /* [SSLv23] = */ {&SSLv3_client_method, 0},
    /* [SSLv3] = */ {&SSLv23_client_method, SSL_OP_NO_SSLv2},
    /* [TLSv1] = */ {&TLSv1_client_method, SSL_OP_NO_SSLv3},
    /* [TLSv1_1] = */ {&TLSv1_1_client_method, SSL_OP_NO_TLSv1},
    /* [TLSv1_2] = */ {&TLSv1_2_client_method, SSL_OP_NO_TLSv1_1}
  };

其中,

class CloudSSL : public Util::Thread
  {

public: enum Version
        {
          // SSLv2,  // Not supported
          SSLv23,
          SSLv3,
          TLSv1,
          TLSv1_1,
          TLSv1_2
        };

最后m_pfSSLMethod是, const SSL_METHOD *(* m_pfSSLMethod)();

1 个答案:

答案 0 :(得分:4)

Visual Studio尚未实现此功能。可以找到解决方法here

你可以使用

const ProcessingOrder m_ProcessingOrder = ProcessingOrder
{
  Process::TUNNEL_IP_VERSION,
  Process::PADDING_BYTE,
  Process::IP_ADDRESS_FIT_IPv6_SIZE,
  Process::PORT_NUMBER
};

对于你的第二个案例。

struct Attribute_t{
         SSL_CTX* const m_pContext;
         Socket* m_pSocket;
         X509* m_pCertificate;
         }m_Attribute;

然后只是

m_Attribute = Attribute_t{SSL_CTX_new(g_SSLChoice[version].m_pfSSLMethod()),
0, 0}