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

Posted

技术标签:

【中文标题】c2797 未实现成员初始化器列表或非静态数据成员初始化器内的列表初始化【英文标题】:c2797 List initialization inside member initializer list or non static data member initializer not implemented 【发布时间】:2015-01-22 09:01:06 【问题描述】:

当我尝试编译我的项目时,我在 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_AttributeSSL_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
  ;

其中,

类 CloudSSL : public Util::Thread
  

公共:枚举版本
        
          // SSLv2, // 不支持
          SSLv23,
          SSLv3,
          TLSv1,
          TLSv1_1,
          TLSv1_2
        ;

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

【问题讨论】:

所以?错误说,此功能未在您的 Visual Studio 版本中实现。关于你的问题? 虽然VS2013支持c++11特性-初始化列表,为什么会出现上述错误!?如何解决这个问题? 此功能在 VS2013 的第一个版本中实现,但在更新 3 后由于其实现中的错误而被删除。 error C2797 : list initialization inside member initializer list的可能重复 【参考方案1】:

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_tSSL_CTX_new(g_SSLChoice[version].m_pfSSLMethod()),
0, 0

【讨论】:

我在问题本身中添加了一个类似的情况。,您的帮助将不胜感激。!谢谢 @ShivarajBhat 如果你还想在类中使用列表初始化,你的结构不应该是匿名的,命名它,并使用与 ProcessingOrder 相同的技术。 先生,正如您之前所说,我尝试过,但它是整个语句中的参数之一,将您的解决方案用于第二种情况导致预期错误(或 in "="位置。整个语句如下所示: CloudSSL::CloudSSL (Tunnel::Manager* const pTunnelManager, const Version version) : Util::Thread(pTunnelManager->getm_ThreadManager()), m_pTunnelManager(pTunnelManager), m_Attribute = Attribute_t SSL_CTX_new(g_SSLChoice[版本].m_pfSSLMethod()), 0, 0 @ShivarajBhat 它不在类初始化程序中,它是初始化程序列表中的初始化程序。我不知道,你的问题是什么。

以上是关于c2797 未实现成员初始化器列表或非静态数据成员初始化器内的列表初始化的主要内容,如果未能解决你的问题,请参考以下文章

c++中静态成员变量和静态成员函数(笔试经历)

在 C++0x 中,非静态数据成员初始化器会覆盖隐式复制构造函数吗?

mfc 类静态成员

使用嵌套类函数时非静态数据成员的使用无效,但函数未嵌套时可以吗?

初始化数据成员的列表的正确术语是啥?

C#图解教程 第六章 深入理解类