我只是不明白为什么我可以在类上使用公共变量,但在尝试使用getLicenceRefused方法时会出现链接错误。我不确定问题是否是因为我之前遇到的CString拷贝构造函数问题所以把参数拿出来了,但我仍然遇到了同样的错误。
所以这个类正在被编译和链接(因为我可以使用成员变量),当我尝试调用任何函数时,我得到了这个错误。
如果我错过了一些重要的内容或包含太多内容,我会尽量保持全面的抱歉。
我只偶尔做c ++(很抱歉,如果我的术语是基于java的),因为它维护旧代码,没有人在这里使用c ++来维持他们的技能水平。 这两个类都是内部类(由现在已经离开的人编写:)),这两个类在同一个解决方案中的不同项目中。 ConfigurationDialog项目依赖于CServerSettings项目。 这是我的主叫代码
int CConfigurationDialog::testConnection(CString connectionName, CString origin)
{
CServerConnection* connection = getConnection();
// these 2 lines of code work and return the correct result, it is the body of the function with problems
auto result = connection->m_licencesRefused.find(origin);
bool connRefused = (result != connection->m_licencesRefused.end());
if(connection->getLicenceRefused(origin)) // this is the line with the link error
班级定义
class CServerConnection
{
public:
CServerConnection();
CServerConnection( LPCTSTR connectionName );
void setLicenceRefused(CString origin, bool value);
bool getLicenceRefused(CString origin);
void setLicenceRequested(CString origin, bool value);
bool getLicenceRequested(CString origin);
void clearAllLicences();
CString getLoggedOnOrigin();
void setURLNotFound(bool notFound);
bool getURLNotFound();
public:
bool m_initialised;
CString m_connectionName;
CString m_lastError;
CString m_password;
CString m_company;
CString m_username;
CString m_sessionID;
public:
std::set<CString> m_licencesRefused;
bool m_urlNotFound;
};
类主体(我不能包含整个文件,因为它超过1000行并包含几个类):
CServerConnection::CServerConnection(LPCTSTR connectionName)
{
m_initialised = false;
m_connectionName = connectionName;
m_lastError = _T( "" );
m_urlNotFound = false;
}
CServerConnection::CServerConnection()
{
m_initialised = false;
m_connectionName = _T( "" );
m_lastError = _T( "" );
m_urlNotFound = false;
}
void CServerConnection::setLicenceRefused(CString origin, bool value)
{
if(value)
{
m_licencesRefused.insert(origin);
}
else
{
m_licencesRefused.erase(origin);
}
}
bool CServerConnection::getLicenceRefused(CString origin)
{
auto result = m_licencesRefused.find(origin);
return (result != m_licencesRefused.end());
}
void CServerConnection::setLicenceRequested(CString origin, bool value)
{
if(value)
{
m_licencesRequested.insert(origin);
}
else
{
m_licencesRequested.erase(origin);
}
}
bool CServerConnection::getLicenceRequested(CString origin)
{
auto result = m_licencesRequested.find(origin);
return (result != m_licencesRequested.end());
}
void CServerConnection::clearAllLicences()
{
m_licencesRefused.clear();
setLicenceRefused(XL_FINANCE_ORIGIN, false);
setLicenceRefused(XL_POP_ORIGIN, false);
m_licencesRequested.clear();
setLicenceRequested(XL_FINANCE_ORIGIN, false);
setLicenceRequested(XL_POP_ORIGIN, false);
}
CString CServerConnection::getLoggedOnOrigin()
{
if(getLicenceRequested(XL_FINANCE_ORIGIN) && !getLicenceRefused(XL_FINANCE_ORIGIN))
{
return XL_FINANCE_ORIGIN;
}
if(getLicenceRequested(XL_POP_ORIGIN) && !getLicenceRefused(XL_POP_ORIGIN))
{
return XL_POP_ORIGIN;
}
return _T("");
}
void CServerConnection::setURLNotFound(bool notFound)
{
m_urlNotFound = notFound;
}
bool CServerConnection::getURLNotFound()
{
return m_urlNotFound;
}
和错误:
error LNK2019: unresolved external symbol "public: bool __thiscall CServerConnection::getLicenceRefused(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >)" (?getLicenceRefused@CServerConnection@@QAE_NV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z) referenced in function "private: int __thiscall CConfigurationDialog::testConnection(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >,class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >)" (?testConnection@CConfigurationDialog@@AAEHV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@0@Z)
答案 0 :(得分:1)
头文件提供了足够的信息来让您声明变量。就此而言,只编译(但不是链接)代码。链接时,链接器必须解决,例如函数引用,例如对ServerConnection::getLicenceRefused
的引用,通过引入相关的机器代码。
您必须告诉链接器链接哪个库或目标文件以引入该机器代码。
getLicenseRefused
中的小写首字母表示它不是Microsoft代码,尽管它可能是从C ++访问的属性。除非熟悉这一点的人应该看到并做出回应,否则你必须自己弄清楚库或目标文件。通常这涉及查看文档,但根据情况,它可能就像向项目添加.cpp文件一样简单;不管。
附录:在我写完上述内容后,OP为该课程提供了源代码。
所以这可能只是将.cpp文件添加到项目中。