Vector2d.h:
#include <iostream>
using namespace std;
template <typename T, typename U>
class Vector2d
{
T x;
U y;
public:
Vector2d (T X, U Y)
{
x = X;
y = Y;
}
void printdata()
{
cout << "X: " << x << " Y: " << y;
}
};
main.cpp中:
#include <iostream>
#include "Vector2d.h"
using namespace std;
template <typename a, typename b>
int main()
{
a Fnum;
b Snum;
cout << "Please enter two numbers ";
cin << Fnum;
cin << Snum;
Vector2d<a, b> TestVector (a Fnum, b Snum);
cout << TestVector.printdata();
return 0;
}
我的问题是我正在尝试制作2D矢量类(用于游戏设计),我想尝试使用模板。我可能想在最后使用浮点数,但我仍然想学习如何使用模板。当我运行这个程序时,我得到了一个:
函数_ _tmainCRTStartup
中未解析的外部符号主要引用
而且我不确定我做错了什么。如果您需要我详细说明,请随时提出。
答案 0 :(得分:3)
main()
无法模板化。
C ++运行时将在您的进程启动时调用此函数。如何知道要提供哪些模板参数?
C ++标准的第3.6.1.2节(ISO / IEC 14882,第二版):
实现不应预定义主函数。此功能不应过载。它应该 返回类型为int类型,但其类型是实现定义的。所有实施 应允许以下两个主要定义:
int main() { /* ... */ }
int main(int argc, char* argv[]) { /* ... */ }
你对main的定义不适合这些定义,因此C ++实现不需要支持它,我不知道单个实现可以合理地这样做,因为它必须提供它自己的类型争论并没有多大意义。
模板的一个目的是允许您编写适用于多种不同类型的代码,而无需编写不同的代码来支持每种类型。这似乎是你想要做的。但是,模板本身不会执行任何操作 - 它们需要实例化,即在某些时候与实际类型一起使用。未编译的模板甚至不会被编译器作为本机代码发出,它只是被丢弃了!
这里所有的都是未经实例化的模板。 在某些时候您需要为模板参数指定实际类型,而您还没有这样做。
当编译器编译包含main()
的文件时,输出对象文件根本不包含main()
。这解释了链接器无法找到它的原因。 (即使你明确地实例化它,链接器也会完全寻找一个不同的符号!)
答案 1 :(得分:3)
main
是一个神奇的函数,专门作为C ++规范的程序入口点。签名必须是int main()
或int main(int arc, char* arv[])
,不能是模板。您的代码没有这样的功能,因此链接器无法将其链接到您的可执行文件中。
可执行程序本身不能模板化,所以没有办法让它变得有意义。您何时指定main
的参数类型?所以你必须(A)在main中使用实际类型,而不是模板,或者(B),将模板化的主体移动到另一个函数,并且主要调用该函数,再次指定特定的模板参数类型。
答案 2 :(得分:1)
您的代码中存在一些问题。首先,main
不能是模板。这是一个非常特殊的功能,需要遵循一些规则。
此外,TestVector
不是变量,而是函数声明。它声明了一个函数,它接受两个类型为a
和b
的对象,并返回Vector2d<a,b>
。
答案 3 :(得分:0)
此外,cin使用此运算符'&gt;&gt;';不是这个'&lt;&lt;'
cin >> Fnum;
cin >> Snum;
答案 4 :(得分:0)
我认为您的代码存在一些问题: 第一个模板在编译之前必须具有某种类型,因此你可以在main()之前使用模板 第二个“cin&lt;