初始化指向模板的指针时无法解析的外部符号
Unresolved External Symbol when initializing pointer to a template
请看下面的代码
Weapon.h
* *#pragma once
#include "GameObject.h"
#include "Stack.h"
#include "Round.h"
class Weapon :
public GameObject
{
public:
Weapon(int);
~Weapon(void);
Stack <Round> *stack1(int rounds) ;
Weapon *next;
void display();
};
* * Weapon.cpp
#include "Weapon.h"
#include <iostream>
using namespace std;
Weapon::Weapon(int size)
{
stack1(size);
}
Weapon::~Weapon(void)
{
}
void Weapon::display()
{
cout << "Weapon Id: " << id << endl;
}
请注意,以上只是一个项目代码的2个文件。然而,当我运行它时,我得到了以下错误
1>------ Build started: Project: stacksCheck, Configuration: Debug Win32 ------
1> Weapon.cpp
1>Weapon.obj : error LNK2001: unresolved external symbol "public: class Stack<class Round> * __thiscall Weapon::stack1(int)" (?stack1@Weapon@@QAEPAV?$Stack@VRound@@@@H@Z)
1>C:UsersyohanDocumentsVisual Studio 2010ProjectsCourseWork2DebugCourseWork2.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我100%肯定这个错误来自这里
stack1(size);
无论何时删除它,代码都能正常工作!!
stack1
是Stack类的对象,Stack类的构造函数接受一个整型参数。Stack
类是一个模板,位于头文件
我怎样才能消除这个错误?
请帮忙!
你声明了一个没有定义的函数:
class Weapon : public GameObject
{
public:
...
Stack <Round> *stack1(int rounds) ; // <=== DECLARATION IS HERE,
// DEFINITION IS NOWHERE
...
};
显然,链接器抱怨找不到Weapon::stack1()
的定义。
无论何时删除它,代码都能正常工作!!
难怪,您不再调用已声明但未定义的函数。您应该在您的实现文件中添加Weapon::stack1()
的定义:
Weapon.cpp
...
Stack<Round>* stack1(int round)
{
...
}
更新:
中
stack1
是Stack
类的对象,其中堆栈类的构造函数接受整数形参。Stack
类是一个模板,位于头文件
当我第一次回答这个问题时,我忽略了这一部分。
所以,即使你是声明一个函数,似乎你的意图是声明一个指针类型的Stack<Round>
的对象。在这种情况下,忘记定义stack1()
函数,正如我在原始答案中建议的那样。只需使用正确的语法来声明指针成员变量:
Weapon.h
class Weapon : public GameObject
{
public:
...
Stack<Round>* stack1; // IF YOU WANT TO DECLARE A MEMBER POINTER,
// THIS IS THE CORRECT SYNTAX.
...
};
然后,在Weapon
类的构造函数中,可以构造Stack<Round>
对象并分配指针:
Weapon.cpp
Weapon::Weapon(int size)
{
stack1 = new Stack<Round>(size);
}
另外,不要忘记在Weapon
的析构函数中添加delete stack1
:
Weapon::~Weapon(int size)
{
if (stack1)
{
delete stack1;
}
}
如果stack1
应该是Weapon
的数据成员(而不是函数),您应该将其声明为:
class Weapon :
public GameObject
{
public:
Weapon(int);
~Weapon(void);
Stack <Round> stack1;
Weapon *next;
void display();
};
,然后在Weapon
构造函数
Weapon::Weapon(int size) : stack1(size)
{ }
在武器构造器中试试:
stack1=new Stack <Round>(size);
同时更新Weapon.h:
Stack <Round> *stack1;
相关文章:
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 未解析的外部符号_MsiLocateComponentW@12.
- 在C++中使用 gRPC 时未解析的外部符号
- LibPrivoxy: 未解析的外部符号 __declspec(dllimport) int __stdcall Sta
- 尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时,我收到未解析的外部符号 winrt_make_*
- 我收到错误LNK2001:未解析的外部符号(C++代码)
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 如何摆脱C++中未解析的外部符号"private: static char"错误?
- 当 lib 已添加到其他依赖项时,如何在 VS 中调试未解析的外部符号错误
- 仅在少数方法(静态或共享库)中解析的外部符号
- 未解析的外部符号"__declspec(dllimport)与 Spdlog c++ 库
- 函数 _main (OPENGL C++) 中引用的未解析的外部符号 ________
- 错误LNK2019未解析的外部符号"public: __thiscall SLinkList<char>::SLinkList<char>(void)"
- 使用静态 constexpr 成员的未解析外部符号
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- Dlib LNK2001未解析的外部符号USER_ERROR__consistent_build_configurati
- 矛盾的未解决的外部符号+未使用的库与VS2017和FFMPEG 4
- 链接器错误:切换到unicode生成给出:未解析的外部符号WinMain
- 错误 LNK2019:未解析的外部符号"外部"C"此错误是什么?
- 错误 : LNK2019: 未解析的外部符号"外部 "C"