尝试构造 std::thread 时出现奇怪的编译器错误:
Strange compiler error when trying to construct std::thread:
以下程序无法通过 g++ -std=c++11 -Wall -Werror test.cpp -o test.o
编译:
#include <thread>
using namespace std;
void fill(int n) {
return;
}
int main() {
thread test(fill, 5);
}
test.cpp:9:12: error: no matching constructor for initialization of 'std::__1::thread'
thread test(fill, 5);
^ ~~~~~~~
是不是因为fill
和#include <algorithm>
的std::fill
冲突了?我没有包括这个,但我想 <thread>
可能有。
将我的函数名称更改为 fillie
(或几乎任何其他名称)允许它在不链接 pthread
的情况下正确编译。
我问是因为这是一条奇怪的编译器错误消息,而且它还意味着线程构造函数无法根据参数(这有道理,但需要确认)来消除我正在使用的函数的歧义。
是的,问题是因为不知道 fill
是 std::fill
还是你的全局 fill
函数。
解决它的一种方法是编写 ::fill
以明确使用全局的。
以下程序无法通过 g++ -std=c++11 -Wall -Werror test.cpp -o test.o
编译:
#include <thread>
using namespace std;
void fill(int n) {
return;
}
int main() {
thread test(fill, 5);
}
test.cpp:9:12: error: no matching constructor for initialization of 'std::__1::thread'
thread test(fill, 5);
^ ~~~~~~~
是不是因为fill
和#include <algorithm>
的std::fill
冲突了?我没有包括这个,但我想 <thread>
可能有。
将我的函数名称更改为 fillie
(或几乎任何其他名称)允许它在不链接 pthread
的情况下正确编译。
我问是因为这是一条奇怪的编译器错误消息,而且它还意味着线程构造函数无法根据参数(这有道理,但需要确认)来消除我正在使用的函数的歧义。
是的,问题是因为不知道 fill
是 std::fill
还是你的全局 fill
函数。
解决它的一种方法是编写 ::fill
以明确使用全局的。