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;
}

私のコンパイラは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)にアクセスできない理由もわかりませんが、別のテンプレート関数で問題なくアクセスできます。

4

1 に答える 1

2

これはテンプレートとは関係ありません。のデストラクタを提供する必要がありますPrimitive。クラスには宣言がありますが、定義はありません。空のデストラクタ本体を追加できます。

~Primitive() {} // empty destructor

この非テンプレートクラスでも同じ種類のリンカエラーが発生します。

struct Foo
{
  ~Foo();
};
于 2012-12-09T08:33:27.373 に答える