- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我无法编译我的 C++ 程序。非常感谢有关此错误的一些帮助。在头文件中,我有这个:
struct workerT{
workerT() : status(true), threadSem(0){}
bool status;
std::function<void(void)> func;
semaphore threadSem;
};
std::vector<workerT> workers;
在我的 .cc 文件中,我尝试像这样初始化该 vector :
fill(workers.begin(), workers.end(), workerT());
这失败并出现以下错误:错误:'TP::workerT& TP::workerT::operator=(const TP::workerT&)' 被隐式删除,因为默认定义格式错误:它指向 semaphore.h 文件。 Semaphore.h 是这样定义的:
public:
semaphore(int value = 0);
....
private:
int value;
....
semaphore(const semaphore& orig) = delete;
const semaphore& operator=(const semaphore& rhs) const = delete;
如果我删除“填充”行,程序就会编译,但我真的需要它,因为我想初始化 vector 。当我制作一个虚拟结构并尝试将 push_back 放入 vector 时,我收到了相同的错误消息。
更新:感谢@DyP!我仍然需要帮助编译。将“填充”行替换为:
std::generate(workers.begin(), workers.end(), free_func);
将这个添加到我的标题中:
workerT free_func(){
return {};
}
得到这些错误:
thread-pool.cc:在构造函数“ThreadPool::ThreadPool(size_t)”中:thread-pool.cc:33:58:错误:“ThreadPool::workerT (ThreadPool::)()”类型的参数与“ThreadPool::workerT (ThreadPool::*)()”不匹配在/usr/include/c++/4.6/algorithm:63:0 包含的文件中, 来自 thread-pool.cc:15:/usr/include/c++/4.6/bits/STL_algo.h: 在函数'void std::generate(_FIter, _FIter, _Generator) [with _FIter = __gnu_cxx::__normal_iterator >, _Generator = ThreadPool::workerT (ThreadPool::*)()]':thread-pool.cc:33:58:从这里实例化/usr/include/c++/4.6/bits/STL_algo.h:5013:2: error: must use '.' or '->' to call pointer-to-member function in '__gen ( ...)',例如'(... ->* __gen) (...)'make: * [thread-pool.o] 错误 1
更新——在我的 .cc 文件中:
using namespace std;
static workerT free_func(){
return {};
}
ThreadPool(...args...){
std::generate(workers.begin(), workers.end(), free_func);
}
错误:
thread-pool.cc:19:10: error: ‘workerT’ does not name a type
thread-pool.cc: In constructor ‘ThreadPool::ThreadPool(size_t)’:
thread-pool.cc:39:49: error: ‘free_func’ was not declared in this scope
make: *** [thread-pool.o] Error 1
再次更新:
static ThreadPool::workerT free_func(){
return {};
}
ThreadPool(...args...){
std::generate(workers.begin(), workers.end(), free_func);
}
在thread-pool.h中:
struct workerT{
workerT() : status(true), threadSem(0){}
bool status;
std::function<void(void)> func;
semaphore threadSem;
};
最佳答案
作为 0x499602d2正确指出,fill
需要从第三个参数复制分配。由于您的类型隐式不可复制,因此您不能使用 fill
.
但是,您可以使用 generate
填充你的 vector :
#include <vector>
#include <algorithm>
struct noncopyable
{
noncopyable() = default;
// make it noncopyable
noncopyable(noncopyable const&) = delete;
noncopyable& operator=(noncopyable const&) = delete;
// make it movable (thanks, gx_)
noncopyable(noncopyable&&) = default;
noncopyable& operator=(noncopyable&&) = default;
};
int main()
{
std::vector<noncopyable> vec(10);
std::generate(begin(vec), end(vec), []()->noncopyable{return {};});
}
注意:这仅适用于 noncopyable
有一个未删除的、可访问的移动构造函数。但是,如果它没有有这样的 ctor,您将无法使用大部分 vector ( resize
需要 MoveInsertable
,这需要复制或移动 ctor) .
对于 g++4.8,使用 generate
,你需要一个免费的功能。我认为这是一个错误。
#include <vector>
#include <algorithm>
struct noncopyable
{
noncopyable() = default;
noncopyable(noncopyable const&) = delete;
};
noncopyable free_func()
{ return {}; }
int main()
{
std::vector<noncopyable> vec;
std::generate(begin(vec), end(vec), free_func);
}
还有一个问题是你是否可以像那样初始化你的 vector 。我会说不。 fill
和 generate
不要构造元素,而是覆盖(分配)。也就是说,您需要先拥有一个包含多个元素的 vector ,然后才能使用它们。
初始化具有 N 个默认构造元素的 vector 的最简单版本是使用构造函数:
std::vector<noncopyable> vec(10);
创建一个 vector
有 10 个默认构造的元素。唯一的要求是 noncopyable
是 DefaultConstructible (本质上,它必须有一个默认构造函数)。
如果您的类型是不可复制且不可移动的,则不能直接使用(或作为数据成员)将其存储在 vector
中(*)。上课C
可移动的,它包含一个不可复制的、不可移动的类型 X
,您需要存储X
作为指针:
(*) 嗯,你可以,但是你不能调整 vector 的大小,你不能插入等等。
struct nocopies_nomoves
{
nocopies_nomoves() = default;
nocopies_nomoves(nocopies_nomoves const&) = delete;
nocopies_nomoves& operator=(nocopies_nomoves const&) = delete;
// not required to be explicitly deleted:
nocopies_nomoves(nocopies_nomoves&&) = delete;
nocopies_nomoves& operator=(nocopies_nomoves&&) = delete;
};
#include <utility>
#include <memory>
class C
{
public:
C() : ptr( new nocopies_nomoves() ) {} // make_unique in C++1y
// I don't think you need to explicitly define those as defaulted;
// at least not if you don't declare ANY of the copy/move ctors, assignment ops
// and dtor
C(C&& rhs) = default;
C& operator=(C&& rhs) = default;
~C() = default;
// not required to be explicitly deleted:
C(C const&) = delete;
C& operator=(C const&) = delete;
private:
std::unique_ptr<nocopies_nomoves> ptr;
};
现在您可以创建 vector<C>
并使用它(例如 resize
, insert
,...)
#include <vector>
#include <algorithm>
static C generate_C()
{
return {};
}
int main()
{
std::vector<C> vec(10);
// note: futile statement below; overwrites the 10 default-constructed
// elements
std::generate(begin(vec), end(vec), generate_C);
}
关于c++ - 错误 : implicitly deleted because the default definition would be ill-formed (vector of structs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19883092/
我写了这个课: class StaticList { private: int headFree; int headList; int locNe
我目前正在使用 SQL Server Management Studio 2005,我遇到了一些问题,但首先是我的 DB 架构的摘录(重要的): imghack link to the image 我
范围:两个表。创建新顾客时,他们会将一些有关他们的信息存储到第二个表中(这也是使用触发器完成的,它按预期工作)。这是我的表结构和关系的示例。 表 1-> 赞助人 +-----+---------+--
我想知道,在整个程序中,我使用了很多指向 cstrings 的 char* 指针,以及其他指针。我想确保在程序完成后删除所有指针,即使 Visual Studio 和 Code Blocks 都为我做
考虑以下代码: class Foo { Monster* monsters[6]; Foo() { for (int i = 0; i < 6; i++)
关于 this page , 是这么写的 One reason is that the operand of delete need not be an lvalue. Consider: delet
我无法在 DELETE CASCADE ON UPDATE CASCADE 上添加外键约束。 我使用两个简单的表格。 TAB1 有 2 列:ID int(10) unsigned NOT NULL A
你好,有没有办法把它放在一个声明中? DELETE e_worklist where wbs_element = '00000000000000000054TTO'. DELETE e_workli
我有一个表,它是我系统的核心,向我的客户显示的所有结果都存储在那里。它增长得非常快,因此每 3 小时我应该删除早于 X 的记录以提高性能。 仅删除这些记录就足够了,还是应该在删除后运行优化表? 我正在
这个问题在这里已经有了答案: delete vs delete[] operators in C++ (7 个答案) 关闭 9 年前。 做和做有什么区别: int* I = new int[100]
为什么这段代码是错误的?我是否遗漏了有关 delete 和 delete[] 行为的内容? void remove_stopwords(char** strings, int* length) {
当我使用 new [] 申请内存时。最后,我使用 delete 来释放内存(不是 delete[])。会不会造成内存泄漏? 两种类型: 内置类型,如 int、char、double ... 我不确定。
所以在代码审查期间,我的一位同事使用了 double* d = new double[foo]; 然后调用了 delete d。我告诉他们应该将其更改为 delete [] d。他们说编译器不需要基本
范围:两个表。当一个新顾客被创建时,他们将一些关于他们的信息存储到第二个表中(这也是使用触发器完成的,它按预期工作)。这是我的表结构和关系的示例。 表 1-> 赞助人 +-----+---------
C++14 介绍 "sized" versions of operator delete ,即 void operator delete( void* ptr, std::size_t sz ); 和
我正在执行类似的语句 DELETE FROM USER WHERE USER_ID=1; 在 SQLDeveloper 中。 由于用户在许多表中被引用(例如用户有订单、设置等),我们激活了 ON DE
出于某种原因,我找不到我需要的确切答案。我在这里搜索了最后 20 分钟。 我知道这很简单。很简单。但由于某种原因我无法触发触发器.. 我有一个包含两列的表格 dbo.HashTags |__Id_|_
这是我的代码: #include #include #include int main() { setvbuf(stdout, NULL, _IONBF, 0); setvbuf
是否可以在 postgres 中使用单个命令删除所有表中的所有行(不破坏数据库),或者在 postgres 中级联删除? 如果没有,那么我该如何重置我的测试数据库? 最佳答案 is it possib
我想删除一些临时文件的内容,所以我正在开发一个小程序来帮我删除它们。我有这两个代码示例,但我对以下内容感到困惑: 哪个代码示例更好? 第一个示例 code1 删除文件 1 和 2,但第二个示例 cod
我是一名优秀的程序员,十分优秀!