0

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;
    }

};

主.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中引用的未解析的外部符号main

而且我不确定我做错了什么。如果您需要我详细说明,请随时询问。

4

5 回答 5

4

main()无法模板化。

当您的进程启动时,C++ 运行时将调用此函数。如何知道要提供哪些模板参数?

C++ 标准(ISO/IEC 14882,第二版)的第 3.6.1.2 节:

实现不应预定义主要功能。该功能不得重载。它应该有一个 int 类型的返回类型,否则它的类型是实现定义的。所有实现都应允许以下两种 main 定义:

int main() { /* ... */ }

int main(int argc, char* argv[]) { /* ... */ }

您对 main 的定义不符合这两个定义中的任何一个,因此不需要 C++ 实现来支持它,而且我不知道有一个实现可以合理地做到这一点,因为它必须提供自己的类型参数并且没有多大意义。

模板的目的之一是允许您编写适用于多种不同类型的代码,而无需编写不同的代码来支持每种类型。这似乎是你想要做的。然而,模板本身不做任何事情——它们需要被实例化,也就是说,在某些时候与真实类型一起使用。编译器甚至不会将未实例化的模板作为本机代码发出,它只是被丢弃了!

您在这里拥有的只是未实例化的模板。 在某些时候,您需要为模板参数指定实际类型,而您还没有这样做。

当编译器编译包含您main()的输出目标文件的文件时,它根本不包含 amain()。这解释了为什么链接器无法找到它。(即使您确实显式实例化了它,链接器也会完全寻找不同的符号!)

于 2013-07-25T16:21:26.490 回答
3

main是一个魔术函数,被 C++ 规范专门称为程序的入口点。签名必须是int main()int main(int arc, char* arv[]),没有模板。您的代码没有这样的功能,因此链接器无法将其链接到您的可执行文件中。

可执行程序本身不能被模板化,所以没有任何意义。你什么时候指定参数类型main?因此,您必须 (A) 在 main 中使用实际类型,而不是模板,或者 (B),将模板化的主体移动到另一个函数,并让 main 调用该函数,再次指定特定的模板参数类型。

于 2013-07-25T16:21:47.900 回答
1

您的代码中有几个问题。第一个是main不能是模板。这是一个非常特殊的功能,需要遵循一些规则。

此外,TestVector不是变量,而是函数声明。它声明了一个函数,该函数接受两个类型的对象ab返回Vector2d<a,b>

于 2013-07-25T16:23:47.893 回答
0

此外,cin 使用此运算符 '>>'; 不是这个'<<'

cin >> Fnum;
cin >> Snum;
于 2013-07-25T16:30:53.260 回答
0

我认为您的代码中存在一些问题:第一个模板在编译之前必须具有某种类型,因此您可以在 main() 之前使用模板第二个“cin<

于 2013-07-25T16:55:51.217 回答