无法转换为'const std :: initializer_list< _Elem>'到'const std :: allocator< _Ty>'其中两个模板都是int

时间:2016-08-03 11:51:18

标签: visual-studio-2010 c++11 visual-c++ stl

5> ...long path...\PredicateEquals.cpp(47): error C2664: 'std::vector<_Ty>::vector(const std::allocator<_Ty> &)' : cannot convert parameter 1 from 'const std::initializer_list<_Elem>' to 'const std::allocator<_Ty> &'
5>          with
5>          [
5>              _Ty=int
5>          ]
5>          and
5>          [
5>              _Elem=int
5>          ]
5>          and
5>          [
5>              _Ty=int
5>          ]
5>          Reason: cannot convert from 'const std::initializer_list<_Elem>' to 'const std::allocator<_Ty>'
5>          with
5>          [
5>              _Elem=int
5>          ]
5>          and
5>          [
5>              _Ty=int
5>          ]
5>          No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

请注意,_Elem=int_Ty=int基本上失败的是从const std::initializer_list<int>转换为const std::vector<int>。我认为这是初始化列表的目的 - 将它们转换为数组。

我的代码基于this answer

头文件

#include <initializer_list>
#include <vector>
class Indexes {
public:
    Indexes(const std::initializer_list<int> uniqueIds);
protected:
    const std::vector<int> uniqueIds_;
};

源文件:

Indexes::Indexes( const std::initializer_list<int> uniqueIds )
    : 
    uniqueIds_(uniqueIds)
{}

错误来自源文件,来自第二个构造函数。如何在这里正确使用构造函数的初始化列表?我宁愿保留std::vector const蚂蚁。但删除const 会删除问题。

我正在使用Microsoft Visual Studio 2010.代码在GCC中完美编译:http://ideone.com/HRC68a

2 个答案:

答案 0 :(得分:1)

你可以尝试:

#include <initializer_list>
#include <vector>
class Indexes {
public:
#ifdef PRE_CXX11_COMPILER
    template<typename... T>
      Indexes(T... t) : uniqueIds_{t...} { }
#else
    Indexes(const std::initializer_list<int> uniqueIds) : uniqueIds_{uniqueIds} { }
#endif
protected:
    const std::vector<int> uniqueIds_;
};

但我不知道这是否适用于MSVC 2010。

如果您无法更改工具链,则需要避免使用2010编译器不支持的C ++ 2011功能。

答案 1 :(得分:0)

到目前为止,我唯一拥有的是使用普通旧C varargs功能的解决方法。这与初始化列表无关,并且要求您将-1作为最后一个参数传递。如果您可以升级编译器,我建议使用它。 未能通过正确的参数会导致细分错误。但在我的情况下,如果使用std::vector::push_back手动填充向量,则会出现重复不可读代码的腐烂。

头文件

#include <vector>
#ifdef CPP_11_COMPILER
  #include <initializer_list>
#else
  #include <stdarg.h>
#endif

class Indexes {
public:
    // Constructor with standard vector
    Indexes(const std::vector<int>& uniqueIds);
    #ifdef CPP_11_COMPILER
    Indexes(const std::initializer_list<int> uniqueIds);
    #else
    // Static method to construct the std::vector and then the class' instance
    // ☠☠☠ WARNING: variadric arguments must be of type short! Last argument MUST BE -1!!!
    static Indexes with_initializer_list(const int unused, ...);
    #endif
protected:
    const std::vector<int> uniqueIds_;
};

源文件

Indexes::Indexes( const std::vector<int>& uniqueIds )
: uniqueIds_(uniqueIds)
{}

#ifdef CPP_11_COMPILER
Indexes::Indexes( const std::initializer_list<int> uniqueIds )
    : uniqueIds_(uniqueIds)

{}
#else
Indexes Indexes::with_initializer_list( const int unused, ... )
{
    va_list ap;
    va_start(ap, unused);
    std::vector<int> items;

    int entry = 0;
    while((entry = va_arg(ap, short))>=0) {
        items.push_back(entry);
    }
    va_end(ap);
    return Indexes(items);
}
#endif

用法

解决方案并不完全可靠,但在编译器升级之前最适合:

Indexes indexes = Indexes::with_initializer_list(0, (short)1,(short)2,(short)3,(short)-1);
// indexes' vector now contains [1, 2, 3]