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
答案 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]