访问模板类型实例成员

时间:2012-12-09 08:31:04

标签: c++ templates

我正在尝试了解模板的工作原理。到目前为止,我阅读了大量有关该主题的文献,但我仍然有很多问题。

我不明白为什么这段代码没有编译:

#include <iostream>
using std::cout;
using std::endl;

struct SimpleVertex
{
    float x, y, z;
    float r, g, b, a;
};

struct TexturedVertex
{
    float x, y, z;
    float u, v;
};

// Template class declaration
template<class T>
class Primitive
{
public:
    Primitive(const T& vertex)
    {
        cout << "Usual constructor" << endl;
    };

    ~Primitive();

};

// Template function
template<class T>
void printVertex (const T& vertex)
{
    cout << "Printing r, g, b, a" << endl;
    cout << vertex.r << " " << vertex.g << " " << vertex.b << " " << vertex.a;
}

int main()
{
    SimpleVertex simple;
    simple.r = 264;
    simple.g = 123;
    simple.b = 731;
    simple.a = 0;

    Primitive<SimpleVertex> prim(simple);
    //printVertex<SimpleVertex>(simple);

    system("pause");
    return 0;
}

我的编译器来自MSVS2012 IDE。当我拨打Primitive<SimpleVertex> prim(simple)行时 - 它不起作用并引发错误:Source.obj : error LNK2019: unresolved external symbol "public: __thiscall Primitive<struct SimpleVertex>::~Primitive<struct SimpleVertex>(void)" (??1?$Primitive@USimpleVertex@@@@QAE@XZ) referenced in function _main,但当我拨打printVertex<SimpleVertex>(simple)时 - 一切正常。

所以我不知道调用简单模板函数和调用templade类构造函数有什么区别?

另外我不明白为什么我不能在Primitive的构造函数中访问SimpleVertex的成员(r,g,b,a),但是可以在单独的模板函数中做到这一点。

1 个答案:

答案 0 :(得分:2)

这与模板无关。您只需要为Primitive提供析构函数。该类有一个声明但没有定义。您可以添加一个空的析构函数体:

~Primitive() {} // empty destructor

您将在此非模板类中获得相同类型的链接器错误:

struct Foo
{
  ~Foo();
};