未解析的外部符号(构造函数)
unresolved external Symbol (Constructor)
在构建时,我得到以下错误:
主要。obj: error LNK2019:未解析的外部符号";public: __cdecl Worker::Worker(void)"(? ? 0 worker@@qeaa@xz)";在功能"main"
主要。obj: error LNK2019:未解析的外部符号";public: virtual __cdecl Worker::~Worker(void)"(? ? 1 worker@@ueaa@xz)";在功能"main"
我找不到问题。(我也看了这里)
main.cpp
#include <iostream>
#include <thread>
#include "worker.h"
using namespace std;
void pause_thread(int n)
{
std::this_thread::sleep_for (std::chrono::seconds(n));
std::cout << "pause of " << n << " seconds endedn";
}
int main()
{
std::cout << "Spawning and detaching 3 threads...n";
std::thread (pause_thread,1).detach();
std::thread (pause_thread,2).detach();
std::thread (pause_thread,3).detach();
std::cout << "Done spawning threads.n";
std::cout << "(the main thread will now pause for 5 seconds)n";
// give the detached threads time to finish (but not guaranteed!):
pause_thread(5);
Worker w;
return 0;
}
worker.h
#ifndef WORKER_H
#define WORKER_H
#include "jobqueue.h"
#include "job.h"
#include <mutex>
#include <thread>
using namespace std;
class Worker
{
private:
JobQueue jobs;
mutex mu;
thread & workerThread;
bool stop;
void work();
public:
Worker();
virtual ~Worker();
void addJob(Job*);
int getJobCount();
};
#endif // WORKER_H
worker.cpp
#include "worker.h"
Worker::Worker(): workerThread(work), stop(false)
{
}
Worker::~Worker()
{
workerThread.join();
}
void Worker::work(){
while (!stop) {
unique_lock<mutex> lock(mu, defer_lock);
lock.lock();
Job* job = jobs.getNextJob();
lock.unlock();
job->run();
delete job;
}
}
void Worker::addJob(Job* job){
jobs.append(job);
}
int Worker::getJobCount(){
unique_lock<mutex> lock(mu);
return jobs.size();
}
project.pro
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += main.cpp
jobqueue.cpp
worker.cpp
HEADERS +=
jobqueue.h
worker.h
job.h
删除Project.pro.user解决了(main-)问题,现在错误再次显示
你的代码中有很多错误,在此之前我建议你应该学习更多的c++基础知识。
正如我在评论中指出的错误一样,让我只用成员函数来回答您的问题:
c++将函数视为第一类公民,与Java相反(Java 8的改进修复了一些问题,但也没有将函数视为第一类公民)。
c++将函数理解为可调用实体的概念:可调用实体是任何可以被调用的东西,即作为函数处理。一个可调用的实体可以是:
-
一个全局函数:只是好的老C函数。它可以被定义、实现和调用:
void f() {} int main() { f(); //Call to f }
-
A成员函数:经典的OO成员函数。它在对象内部调用,并对其数据进行操作:
struct foo { void f(); }; int main() { foo myfoo; myfoo.f(); //Call to foo::f }
-
静态成员函数:它是一个没有链接到对象的成员函数,它在类级别操作,所以它的签名与全局函数的签名相同(记住这一点,这一点很重要,我们将在后面看到)
struct foo { static void f(); { int main() { foo::f(); //Call to foo::f }
-
functor: functor只是一个类,它的对象被设计成像函数一样工作。这就实现了()操作符的重载:
struct f { void operator()() const {} }; int main() { f myf; myf(); //Call to foo }
标准库定义了模板
std::function
,它是一个类型擦除的函子,用于保存任何类型的可调用实体:#include <functional> void f() {} int main() { std::function<void()> f_wrapper; f_wrapper(); //Call to f_wrapper, which is an indirect call to f }
-
lambda表达式: lambda表达式只是一个本地定义的匿名函子:
int main() { std::function<void()> lambda = [](){ std::cout << "hello!"; }; }
你好!
-
指向函数的指针: C允许用户通过函数指针来存储函数,就像它允许存储指向数据的指针一样。c++也有相同的功能,并扩展为成员函数:
如前所述,静态成员函数与全局函数具有相同的签名,因此语法与上面的示例完全相同。void f() {} void g( void(*function)() ) { function(); //Call to the function referenced by the pointer passed as parameter } int main() { g(f); //Call to g passing f as parameter. Its an indirect call to f. Note that the & is not needed }
但对于成员函数就不一样了:成员函数链接到对象,所以它在对象中被调用。成员函数指针的语法如下:struct foo { voif f(); }; typedef void(foo::* pointer_to_f_type)(); int main() { pointer_to_f_pointer ptr = &foo::f; //Note that the & is needed, just like in variable pointers foo myfoo; (myfoo.*ptr)(); //Call to the foo member function pointed by ptr (foo::f) using myfoo as object }
特定签名的成员函数指针与指向相同签名的全局/静态函数的指针无关,不能从/转换为成员指针到非成员指针,反之亦然。
因为函数指针和成员函数指针是完全分开的东西,所以不能处理任何类型的函数直接以齐次的方式。例如,不能创建既包含函数指针又包含成员函数指针的数组。然而,标准库提供了函数模板
std::bind
,它允许我们将函数绑定到一些(或全部)调用形参。也就是说,std::bind()
返回的对象表示对可调用实体的部分(或完整)调用。例如:void f( int , int , int ) {} int main() { std::function<void(int,int,int)> f_wrapper = f; f(1,2,3); //Ok f_wrapper(1,2,3); //Ok std::function<void()> f_call = std::bind( f , 1 , 2 , 3 ); //f_call represents a partial call (Complete in this case) fo f f_call(); //Execute the call std::function<void(int)> partial_f_call = std::bind( f , std::placeholders::_1 , 2 , 3 ); partial_f_call( 1 ); //Same execution as above }
正如您所看到的,
std::bind()
允许我们将某些参数绑定到函数,使一个可调用的实体表示对函数的调用。因此,可用于将对象绑定到成员函数,从而形成可调用实体使用与其他可调用实体初始化的std::function
实例完全相同的形式。即我们可以使用std::function
以同样的方式存储成员函数和非成员函数,并以同样的方式使用它**:void f(); struct foo { void f(); }; int main() { std::vector<std::function<void()>> functions; foo myfoo; functions.push_back( f ); functions.push_back( std::bind( &foo::f , myfoo ) ); functions.push_back( [](){} ); ... for( const auto& function : functions ) function(); }
可以看到,有多种形式的可调用实体。重要的一点是,有人可以使用c++模板并依赖于duck类型来使用可调用对象作为参数传递的实体:
template<typename F>
void call_function( const F& function )
{
function(); //function should be any kind of thing which could be called, that is, a callable entity
}
这正是std::thread
构造函数所做的。它接受任何可调用的实体,一组调用的参数,启动一个新线程,然后在新线程上调用可调用实体(通过join()
或detach()
)。它的实现可以是这样的:
template<typename F , typename... ARGS>
thread::thread( F&& function , ARGS&&... args )
{
_thread = create_thread();
_function = std::bind( std::forward<F>( function ) , std::forward<ARGS>( args )... );
}
void thread::detach()
{
detach_thread( _thread );
_function();
}
void thread::join()
{
join_thread( _thread );
_function();
}
当然这不是一个工作实现,只是一个概述:p
所以现在你可以理解为什么你的方法不起作用,以及你可以做些什么来解决这个问题。具体来说,使用std::bind()
来创建一个可调用的实体如果你想在线程上使用成员函数,
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 构造函数参数列表之后的结肠符号
- 未解决的外部符号C 用于继承和构造函数
- 未解析的外部符号突然出现.构造函数故障
- 构造函数中x86_64的 GCC 未定义符号C++体系结构
- 在我的程序中"无符号"之前的预期主表达式(析构函数和构造函数问题)
- vc++无法解析的外部符号(不能调用构造函数)
- CUDA:__device__和__global__错误:在"无符号"/"void"之前预期的构造函数、析构函数或类型转换"
- 使用":"符号在C++中定义构造函数
- "错误 LNK2019: 未解析的外部符号 "公共: __thiscall: 构造函数" 问题
- 体系结构x86_64的未定义符号(复制构造函数)
- 未解析的外部符号(构造函数)