将从元组派生的对象放入C++中的向量中
placing objects deriving from tuple into a vector in C++
我想创建一个有3个值的结构:一个字符串和两个int。字符串是必需的,但其中一个(或两个)int是可选的,如果未指定,则可以默认为-1。
然而,与其使用结构,我想我应该尝试一个std::元组。为了合并两个int的可选性,我设置了一个"Trio"类,该类继承自std::tuple,如下所示:
#include <string>
#include <tuple>
class Trio : public std::tuple<std::string, int, int>
{
public:
explicit Trio(std::string const & name, int val1 = -1, int val2 = -1)
:
tuple(name, val1, val2)
{
}
};
然后,我通过将一些Trio对象推入std::vector:来测试Trio类
#include <vector>
int main(void)
{
std::vector<Trio> trios;
Trio trio("trio1", 1, 1);
trios.push_back(trio);
return 0;
}
它在Visual Studio 2010中给了我以下错误:
>c:program files (x86)microsoft visual studio 10.0vcincludetuple(127):
error C2664: 'std::basic_string<_Elem,_Traits,_Ax>::basic_string(const
std::basic_string<_Elem,_Traits,_Ax> &)' : cannot convert parameter 1
from 'const Trio' to 'const std::basic_string<_Elem,_Traits,_Ax> &'
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Ax=std::allocator<char>
]
Reason: cannot convert from 'const Trio' to 'const
std::basic_string<_Elem,_Traits,_Ax>'
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Ax=std::allocator<char>
]
No user-defined-conversion operator available that can perform
this conversion, or the operator cannot be called
有人明白我在这里做错了什么吗?有什么明显的东西是我没有看到的吗?我是否严重滥用了std::tuple的用法?
谢谢你,
Aaron
这是VC10的错误。
VC10抱怨,因为您的类似乎没有复制构造函数。因此,为了复制Trio
类型的值,它试图将它们转换为string
,这是您提供的构造函数所接受的(其他参数可以被赋予默认值)。这就是你所抱怨的错误:
无法将参数1从"const Trio"转换为"const std::basic_string<_Elem,_Traits,_Ax>&'
您可以通过显式添加复制构造函数并观察错误消失来验证这确实是正在发生的事情:
Trio(Trio const& t) { *this = t; }
现在VC10很满意,因为它看到了一个复制构造函数,并且代码编译得很好。
然而,当用户没有显式提供复制构造函数时,编译器应该隐式生成一个。根据C++11标准第12.8/7段:
如果类定义没有显式声明复制构造函数,则隐式声明一个复制构造函数。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数被定义为已删除;否则,它被定义为默认值(8.4)。〔…〕
类Trio
没有显式声明任何复制构造函数。根据C++11标准第12.8/2段,事实上:
类X的非模板构造函数是复制构造函数,如果它的第一个参数是类型X&,常量X&,易失性X&或常量易失性X&,并且要么没有其他参数,要么所有其他参数都有默认参数(8.3.6)
因此,显式提供的构造函数是而不是复制构造函数,并且不应禁止隐式生成复制构造函数。
VC10可能会将您提供的构造函数误解为副本构造函数,因此不会隐式生成副本构造函数。然而,由于上面所写的内容,这种行为是不正确的,属于错误。(*)
附带说明一下,您的代码在Clang 3.2、GCC 4.7.2和ICC 13.0.1上编译良好。
更新:
我试图用不涉及std::tuple<>
的更简单的数据结构来重现这个问题,但我失败了。因此,这个错误不仅仅是因为VC10将您的构造函数误解为显式复制构造函数。然而,这并不能改变VC10行为不正确的事实
看起来这只是VS2010中的一个问题。我没有查看是否有关于它的bug。这将在VS2012和gcc-4.7.2 中编译
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 将结构向量排序为子组
- 在C++中调整向量中的索引
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么