Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有唯一\u ptr问题的类_C++_C++11 - Fatal编程技术网

C++ 具有唯一\u ptr问题的类

C++ 具有唯一\u ptr问题的类,c++,c++11,C++,C++11,使用emplace_back时,传递的参数(k,v)必须存在构造函数,因此我需要下面的构造函数。然而,由于我使用unique_ptr,它抱怨无法访问“delete”,我认为这意味着我正在做一些允许我拥有多个指针的事情 我搞不懂语法。如何以正确的方式编写此构造函数 struct KV{ unique_ptr<string> k, v; KV(){} KV (unique_ptr<string> k_,unique_ptr<string>

使用emplace_back时,传递的参数(k,v)必须存在构造函数,因此我需要下面的构造函数。然而,由于我使用unique_ptr,它抱怨无法访问“delete”,我认为这意味着我正在做一些允许我拥有多个指针的事情

我搞不懂语法。如何以正确的方式编写此构造函数

struct KV{ 
    unique_ptr<string> k, v;
    KV(){} 
    KV (unique_ptr<string> k_,unique_ptr<string> v_):k(move(k_)),v(move(v_)){} 
};
struct KV{
唯一_ptr k,v;
KV(){}
KV(唯一的,唯一的):k(移动(k)),v(移动(v)){
};

您的构造函数正常。一个可能的问题是,在将两个
unique_ptr
提供给构造函数时,您没有移动它们:

#include <memory>
#include <string>

using namespace std;

struct KV{
   unique_ptr<string> k, v;
   KV(){}
   KV (unique_ptr<string> k_,unique_ptr<string> v_):k(move(k_)),v(move(v_)){}
};

int main()
{
   unique_ptr<string> p1(new string());
   unique_ptr<string> p2(new string());

   // KV v(p1, p2); // ERROR!
   KV kv(move(p1), move(p2)); // OK

   vector<KV> v;    
   v.emplace_back(move(p1), move(p2)); // OK       
}
#包括
#包括
使用名称空间std;
结构千伏{
唯一_ptr k,v;
KV(){}
KV(唯一的,唯一的):k(移动(k)),v(移动(v)){
};
int main()
{
唯一的_ptr p1(新字符串());
唯一的_ptr p2(新字符串());
//KV v(p1,p2);//错误!
千伏(移动(p1),移动(p2));//正常
向量v;
v、 向后放置(移动(p1),移动(p2));//确定
}
更新:

VS2012发布时,VC11不支持可变模板。
emplace\u back()
的正确实现应该是可变的,但MS提供了一个虚拟的。CTP发布后,只有编译器更新了可变模板支持,但STL没有更新。因此,您仍然会得到错误


如果你不能改变你的编译器,除了等待产品的下一个版本发布之外,没有什么可以做的。同时,避免使用
emplace_back()
,而是使用
push_back()

你没有提到你要
emplace_back
放在哪个容器中,但是假设它是一个
向量,如果你的
KV
结构真的那么简单,就没有必要声明任何构造函数。只需使用聚合初始化

#include <memory>
#include <string>
#include <utility>
#include <vector>

using namespace std;

struct KV
{
   unique_ptr<string> k, v;
   // KV(){}
   // KV (unique_ptr<string> k_,unique_ptr<string> v_):k(move(k_)),v(move(v_)){}
};

int main()
{
   unique_ptr<string> p1(new string());
   unique_ptr<string> p2(new string());

   KV v{move(p1), move(p2)}; // initialize an instance
                             // this step is not necessary, you can skip it

   vector<KV> vec;

   vec.emplace_back(KV{move(v.k), move(v.v)});
}
#包括
#包括
#包括
#包括
使用名称空间std;
结构千伏
{
唯一_ptr k,v;
//KV(){}
//KV(唯一的,唯一的):k(移动(k)),v(移动(v)){
};
int main()
{
唯一的_ptr p1(新字符串());
唯一的_ptr p2(新字符串());
KV v{move(p1),move(p2)};//初始化实例
//此步骤不是必需的,您可以跳过它
向量向量机;
向量后置(KV{move(v.k),move(v.v)});
}

你不是新来的,你应该知道不应该把一个问题贴出来。显示整个错误消息。最好在ideone或其他联机编译器上链接到一个简短的自包含示例,这样我们就有了错误消息和导致错误的完整代码。@BenVoigt:gcc或ideone是否支持
emplace_back
?我知道VisualStudio会这么做,但我没有想到,andy知道我的语法是正确的,我只是说它是错误的,如果你选择C++11模式。这不会编译
ls.emplace_back(move(key),move(make_unique(tempstring))但是
KV(移动(键),移动(使_唯一(tempstring))
hmmm+1@acidzombie24:你能再具体一点吗?
ls
是如何声明的?什么是
key
?key是
unqiue
,ls是
vector&ls
@acidzombie24:它可以工作。你使用的是什么版本的VC?你有CTP吗?我有2012年11月的CTP。这在那里不起作用。该死。我要看看我能做什么-编辑-。该源代码显然不适合我:(我很想这样做,但MSVC不支持
{}
还没有。虽然这正是我想说的do@acidzombie24MSVC不应该对此有任何问题,它是聚合初始化,这是C++11之前的东西。您正在考虑用于统一初始化语法的带括号的init列表。如果您使用
emplace_back()
但是,不需要构建一个
KV
。您只需通过arguments@AndyProwl在你发布之前,我在代码中添加了一条评论:)@Praetorian:但你仍然在调用
emplace\u back()
:-)中添加了评论