2012-12-09 150 views
1

我想了解模板如何工作。到目前为止,我阅读了大量关于这个主题的文献,但我仍然有很多问题。访问模板类型实例成员

我不明白为什么这个代码不编译:

#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)" ([email protected]@@@@[email protected]) referenced in function _main,但是当我打电话printVertex<SimpleVertex>(simple)而不是 - 一切工作正常。

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

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

回答

2

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

~Primitive() {} // empty destructor 

你会得到同样的链接错误的这种非模板类:

struct Foo 
{ 
    ~Foo(); 
}; 
+0

呀,谢谢你。我讨厌我注意力不集中=( – GuardianX

相关问题