テンプレートがどのように機能するかを理解しようとしています。これまでのところ、このテーマに関するたくさんの文献を読んでいますが、まだたくさんの質問があります。
このコードがコンパイルされない理由がわかりません。
#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;
}
私のコンパイラはMSVS2012IDEからのものです。lineを呼び出す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)にアクセスできない理由もわかりませんが、別のテンプレート関数で問題なくアクセスできます。