无法让这个带有模板的类工作?
Can't get this class with template to work?
我正试图用一个通用对象在C++中编写类似C#接口的东西,但我无法实现。每次我在main中创建一个新实例时,我都会收到以下错误:错误1错误LNK2019:未解析的外部符号"public:__thiscall AccountRepository::AccountRepository(void)">
main.cpp
#include <iostream>
#include <stdio.h>
#include <string>
#include "AccountRepository.h"
using namespace std;
int main(){
AccountRepository repo;
return 0;
}
IRepository.h
#pragma once
#include <vector>
using namespace std;
template <class Entity>
class IRepository
{
public:
virtual bool add(Entity entity) = 0;
virtual bool update(Entity entity) = 0;
virtual Entity getById(int Id) = 0;
virtual bool remove(Entity entity) = 0;
virtual vector<Entity> getAll() = 0;
};
AccountRepository.h
#pragma once
#include "IRepository.h"
#include "Account.h"
#include <vector>
class AccountRepository : public IRepository<Account>{
private:
vector<Account> _accounts;
public:
AccountRepository();
~AccountRepository();
virtual bool add(Account entity) override;
virtual bool update(Account entity) override;
virtual Account getById(int Id) override;
virtual bool remove(Account entity) override;
virtual vector<Account> getAll() override;
};
AccountReposity.cpp
#include "AccountRepository.h"
inline AccountRepository::AccountRepository()
{
}
inline AccountRepository::~AccountRepository()
{
}
inline bool AccountRepository::add(Account entity)
{
_accounts.push_back(entity);
return true;
}
inline bool AccountRepository::update(Account entity)
{
for (Account account : _accounts){
if (account.getId() == entity.getId()){
account.setName(entity.getName());
account.setDescription(entity.getDescription());
return true;
}
}
return false;
}
inline Account AccountRepository::getById(int Id)
{
for (Account account: _accounts)
{
if (account.getId() == Id)
return account;
}
}
inline bool AccountRepository::remove(Account entity)
{
vector<Account>::iterator it;
for (it = _accounts.begin(); it != _accounts.end(); ++it){
if (it->getId() == entity.getId())
{
_accounts.erase(it);
return true;
}
}
return false;
}
inline vector<Account> AccountRepository::getAll()
{
return _accounts;
}
您滥用了inline
关键字。将其视为"此函数的实现在标头中"。
这立即揭示了问题:您的一个cpp文件中有很多inline
函数,而这个文件不是头。每个使用inline
函数的cpp文件都需要包含或包含该函数的定义。问题是链接器使用inline
函数做了一些神奇的事情,因为它们应该是许多cpp文件中的一个副本。因此编译器编译main.cpp
,并且(由于main不知道函数是内联的,请注意,稍后链接器应该链接到默认构造函数中)。编译器随后编译AccountReposity.cpp
,发现没有使用内联函数,因此跳过它。随后,链接器无法找到要使用的AccountRepository()
的副本,并报告错误。如果在头中正确定义了函数体,那么在进入链接阶段之前,它将在编译步骤中实例化为main.cpp
。
某些编译器对inline
函数进行特殊处理,这一事实根本不会影响经验法则。其他编译器不会对inline
函数进行任何特殊的优化,将其视为优化会导致出现错误。忽略优化可以更清楚地显示关键字的位置。
如果您想将AccountRepository
的成员函数声明为inline
,您必须按照[basic.def.odr]/3:在所有使用它们的翻译单元中使它们为人所知
(…)内联函数应在使用它的每个翻译单元中定义。
从函数定义中删除inline
,或者将它们全部移到标头中。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作