因此,我对STL提供的C 11并发编程功能还很陌生,我在玩以下代码:
#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std;
template <typename T>
class Container
{
private:
mutex mu;
list<T> myList;
public:
void add(T element)
{
lock_guard<mutex> lock1(mu);
myList.emplace_back(element);
}
void remove()
{
lock_guard<mutex>lock2(mu);
myList.pop_back();
}
void print()
{
for(const auto & element : myList)
{
cout << element << endl;
}
}
};
int main()
{
Container<int> c;
thread t1(&Container<int>::add, c, 5); //ERROR
thread t2(&Container<int>::add, c, 10); //ERROR
thread t4(&Container<int>::remove, c); //ERROR
thread t5(&Container<int>::remove, c); //ERROR
t1.join();
t2.join();
t4.join();
t5.join();
c.print();
}
当我试图编译代码时,我标记为“ERROR”的行导致编译器告诉我:
error: call to implicitly-deleted copy constructor of
'typename decay<Container<int> &>::type' (aka 'Container<int>')
return _VSTD::forward<_Tp>(__t);
error: no matching constructor for initialization of
'__tuple_leaf<1UL, Container<int> >'
__tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))...,
error: no matching function for call to '__decay_copy'
__decay_copy(_VSTD::forward<_Args>(__args))...));
^~~~~~~~~~~~
现在,我在写代码的时候已经看过这个问题和这个问题,但我仍然遗漏了一些小细节。如果有人能提供一些帮助,那就太好了。谢谢
< code >线程需要复制其所有参数,而您的< code >容器是不可复制的。它是不可复制的,因为它的一个成员(< code>std::mutex)是不可复制的。这个问题的解决方案不是直接给< code > thread < code > c ,而是给它一些可以复制的东西。
即:
thread t1(&Container<int>::add, &c, 5);
以下内容应该也可以,但可能不行(参见T.C .的评论):
thread t2(&Container<int>::add, std::ref(c), 10);
请注意,这没有为您编译是一件好事,因为否则您的线程将在容器的各种副本上执行工作-而不仅仅是您可能预期的那个。
下一个;让我们调用模板化成员函数的不同实例: 最后是问题: Foo类的所有实例都来自同一个类?看来答案是肯定的但是...第一个Foo实例的末尾有f成员函数的两个重载:
是否有人知道此显式特化是否有效: clang 主干 (12/3/2013) 给出以下错误: f:...\test.cpp:36:20: 错误: 从类 'O' 中出线定义 “Fun” 没有定义 1生成错误。 任何来自标准的支持参考来证明你的答案将不胜感激! 注意:我有点惊讶这是一个错误——我认为应该为任何以< code >开始实例化“Fun”的模板参数族选择专门化 这是一个叮当的错误还是我期望中的错
我有一个模板化的C++类,它也有一个模板化的成员函数。这个成员函数的模板参数以特定的方式依赖于类的模板参数(请参阅下面的代码)。我正在为其模板参数的两个不同值实例化(而不是专门化)该类。一切都在这一点上进行。但是,如果我调用模板化的成员函数,对第一个实例化对象的调用只会编译,而不会编译第二个。似乎编译器没有为模板类的第二次实例化实例化模板化成员函数。我正在使用“g++filename.cpp”编译
我有一个问题,我想在下面的代码中专门化模板类的模板成员函数。这个问题的答案是模板类成员函数的显式特化,这似乎表明它无法完成。这是正确的吗,如果是这样,我可以使用任何解决方法,以便在编译时通过内联inc函数进行扩展? 非常感谢! g吐槽道: test2.cpp:32:13: 错误: 非命名空间作用域中的显式专用化 'struct IdxIterator' test2.cpp:32:25: 错误: 非
我想在模板类之外定义如下所述的函数。 已经为第二个参数尝试了很多组合,它是一个模板,并且也接受默认参数。 我希望它是在类之外定义的实际得到编译器错误,如果它是简单的类型,我可以很容易地在第二个参数中提到int、浮动等。
我很难弄清楚如何使用适当的模板化参数调用setValue函数。在ParameterBase抽象基类中不可能有模板化的参数。非常感谢任何帮助。 附注。我没有使用boost::any的灵活性。
我想用两种模板类型编写一个模板化函数:一种是bool,另一种是typename,我想专门研究typename。 这就是我想要的,但只针对T的几种类型: 没有bool在那里,我可以做这样的事情: 我搞不懂这句话的语法,而专门化方面的微软文档只涉及单一类型的情况。