C ++模板变量赋值混乱

时间:2013-07-25 16:18:32

标签: c++ templates testing compilation

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

中未解析的外部符号主要引用

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

5 个答案:

答案 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不是变量,而是函数声明。它声明了一个函数,它接受两个类型为ab的对象,并返回Vector2d<a,b>

答案 3 :(得分:0)

此外,cin使用此运算符'&gt;&gt;';不是这个'&lt;&lt;'

cin >> Fnum;
cin >> Snum;

答案 4 :(得分:0)

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