gpt4 book ai didi

C++:如何在复杂的模板类中指定线程函数?

转载 作者:行者123 更新时间:2023-11-27 22:45:29 24 4
gpt4 key购买 nike

最小化代码如下。目标是使用 C++ 标准线程库从模板类并行复制数据。 Source 的对象必须作为引用传输,因为我需要使用 C++ 的多态性特性。数据类型可以是各种复杂的对象,而不是最小化代码中的int。编译错误为

error C3867: 'Array::Thread': non-standard syntax; use '&' to create a pointer to member

我已经从互联网上阅读了很多相关的帖子,但它们都太简单而无法应用。我还尝试使用仿函数来指定线程工作函数但失败了。那么,如何解决这种复杂模板情况下的问题(可以使用仿函数)?我正在使用 Visual Studio 2015,但我认为类似的错误消息会出现在 Linux 上。非常感谢您的帮助。

#include <thread>
#include <iostream>
#include <vector>
using namespace std;

template < typename U >
class Source {
public:
Source(U data) : data(data) {}
U Get() { return data; }
private:
U data;
};

template < typename U >
class Array {
public:
Array(U data) {
for (int i = 0; i < 10; i++)
t[i] = data;
}
void Thread(int i, Source<U>& source) {
t[i] = source.Get();
}
void ThreadsWrapper(Source<U>& source) {
vector<thread> threads;
for (int i = 0; i < 10; i++)
threads.push_back(thread(Thread, i, ref(source)));

for (auto & t : threads)
t.join();
}
private:
U t[10];
};

int main()
{
Source<int> c(7);
Array<int> a(2);
a.ThreadsWrapper(c);
}

最佳答案

问题是“简单”的语法。你需要的是:

threads.push_back(std::thread(&Array::Thread, this, i, ref(source)));

第一个问题是Thread是一个成员函数的名字。要获取它的地址,您需要 &Array::Thread。这就是(或多或少)错误消息告诉您的内容。第二个问题是必须在对象上调用成员函数,这就是为什么在创建线程时必须传递 this 的原因。

关于C++:如何在复杂的模板类中指定线程函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43558597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com