2012-12-09 193 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

相關問題