2011-12-25 10 views
4

静的関数とフィールドのみを持つテンプレートクラスを持つヘッダーがあります。静的フィールドテンプレートの特殊化への "未定義参照"

template<typename T> class Luaproxy { 

    static std::map<std::string, fieldproxy> fields; 
    static const char * const CLASS_NAME; 
    static void addfields(); 
    static int __newindex(lua_State * l){ 
     //implemented stuff, references to fields... 
    } 
    //etc 
} 

あなたは機能の一部を見ることができるように私はテンプレートの特殊化とそれらを実装しようとするためにのみ、宣言されています。私は、両方のヘッダに実装される機能のみ.CPPに特化されているものからLuaproxy<test>::fieldsに未定義の参照エラーを得る

struct test { int a; } 
template<> map<string, fieldproxy> Luaproxy<test>::fields; 
template<> const char * const Luaproxy<test>::CLASS_NAME=typeid(test).name(); 
template<> void Luaproxy<test>::addfields(){ 
    //stuff, references to fields... 
} 

:私は.ccpファイルで

。リンクにはLuaproxy<test>::CLASS_NAMELuaproxy<test>::addfieldsがあるように見えることに注意してください。

これは何を特別なものにするのですか?mapはとても特別ですか?

+0

「テンプレートクラスLuaproxy <>;」を作成します。あなたのcppファイルの一番上にあるエントリ。私はそれを解決しなければならないと思う – Arunmu

答えて

5

私はついにそれを働かせることができたが、私はtemplate<> std::map<std::string, fieldproxy> Luaproxy<test>::fields=std::map<std::string, fieldproxy>();

明示的なコンストラクタは、変数を効果的に出力するようgccに納得させるようです。私は#gccに説明を求めましたが、残念ながらそのチャンネルは常に黙っています。

2

私はあなたのコードをVC9にいくつかの余分なセミコロンと名前空間タグだけでビルドしましたが、コンパイルエラーもリンクエラーもありませんでした。ここ

私が構築するものです。

Luaproxy.hファイル:

#pragma once 
#include <map> 
#include <string> 
typedef int fieldproxy; 
struct lua_State; 
struct test { 
    int a; 
}; 
template<typename T> 
class Luaproxy 
{ 
public: 
    static std::map<std::string, fieldproxy> fields; 
    static const char * const CLASS_NAME; 
    static void addfields(); 
    static int __newindex(lua_State * l){} 
}; 

Luaproxy.cppファイル:

#include "Luaproxy.h" 
template<> std::map<std::string, fieldproxy> Luaproxy<test>::fields; 
template<> const char * const Luaproxy<test>::CLASS_NAME=typeid(test).name(); 
template<> void Luaproxy<test>::addfields(){} 

main.cppにファイル:

#include "Luaproxy.h" 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Luaproxy<test> *p = new Luaproxy<test>; 
    p->fields["foo"] = 0; 
    delete p; 
    return 0; 
} 
+0

あなたのコードは私のためには動作しません、それは奇妙です。私のコンパイラはgcc 4.6.1です。私は偶然、フィールドに明示的なコンストラクタ宣言を追加しました。そして今コンパイルされます。 3時間後に私は自己返信し、より深く説明することができます。 –

関連する問題