2017-04-26 5 views
1

私は、データ配列(静的な静的なもの、変更可能なもの)とアクセサメソッドを持つ設定ファイルを生成しました。問題は、データ型の1つがテンプレート化されるようになりましたが、コンパイラにそれを受け入れることができないということです。テンプレートクラスの配列定義

テンプレート型は非ポッドですが、デフォルトで構成可能です。

使用される定義はcppファイル内にありますが、コード生成中にテンプレート型がわからないため、これ以上はできません。

I.e.私は現在、私はPOD_ONES定義と「のために「ストレージクラスがここで指定することはできません」を取得(より良い私ができるが、ヘッダ外定義する場合)、次の

template<typename T> 
class LargeConfig : 
{ 
public: 
    // methods 
private: 
    static const POD1 POD_ONES[]; 
    T ManyTs[]; 
}; 

template<typename T> 
static const POD1 LargeConfig<T>::POD_ONES[] = 
{ 
    { 0U, 1U}, // instance 1 
    { 1U, 1U}, // instance 2 
    ... 
}; 

template<typename T> 
T LargeConfig<T>::ManyTs[] = 
{ 
    T(), // instance 1 
    T(), // instance 2 
    ... 
}; 

ような何かをしたいと思いますManyTsの場合、非静的データメンバーはそのクラスの外に定義することはできません。 "

しかし確かに、C++のクラスでテンプレート化された非自明な配列を作成するには何らかの方法が必要ですか?これまでのところ、テンプレート型が整数型の例しか見つかりませんでした。

+0

'POD1'は有効範囲にありますか?それが定義されている限り私はエラーを得ることができません。 – NathanOliver

+0

@ NathanOliver:Hm。本当にありがとう。コードを変更しながら、静的POD構造体constの1つのメンバーを作成しました。どうやら、私の組み込みコンパイラがそれを非PODとして扱い、上記のエラーメッセージを出したのです。 constメンバーがなければ、POD_ONESパートが動作します。 – Troels

答えて

1

まず、ManyTsstaticと宣言されていないため、約nonstatic data member defined outside of classのエラーが発生します。あなたはstaticメンバー定義するときに

は、キーワード staticを入れないでください:私はコンパイル

template<typename T> 
class LargeConfig 
{ 
public: 
    // methods 
private: 
    static const POD1 POD_ONES[]; 
    static T ManyTs[]; 
}; 

template<typename T> 
const POD1 LargeConfig<T>::POD_ONES[] = 
{ 
    { 0U, 1U}, // instance 1 
    { 1U, 1U}, // instance 2 
}; 

template<typename T> 
T LargeConfig<T>::ManyTs[] = 
{ 
    T(), // instance 1 
    T() // instance 2 
}; 

sample demo

0

しよう(それらへの迅速なアクセスを得るために、公開あなたのstaticデータメンバを設定)ここであなたのコードをコンパイルするには(g ++ 5.4)私は7行目に構文エラーがあります。

templates.cpp:16:44: error: ‘static’ may not be used when defining (as opposed to declaring) a static data member [-fpermissive] 
static const POD1 LargeConfig<T>::POD_ONES[] = 
              ^
templates.cpp:23:26: error: ‘T LargeConfig<T>::ManyTs []’ is not a static data member of ‘class LargeConfig<T>’ 
T LargeConfig<T>::ManyTs[] = 
         ^
templates.cpp:23:26: error: template definition of non-template ‘T LargeConfig<T>::ManyTs []’ 

最初のメッセージはthis problemに関連しています。宣言のためにのみ、静的にデータ型を定義することはできません。

最後のエラーは、単純にManyTsメンバーを静的に修正したことで修正されました。

自分で示すように
class POD1 { 

}; 

template<typename T> 
class LargeConfig 
{ 
public: 
    // methods 
private: 
    static const POD1 POD_ONES[]; 
    static T ManyTs[]; 
    T ManyTsAgain[10]; 
}; 

template<typename T> 
const POD1 LargeConfig<T>::POD_ONES[] = 
{ 
    { 0U, 1U}, // instance 1 
    { 1U, 1U}, // instance 2 
}; 

template<typename T> 
T LargeConfig<T>::ManyTs[] = 
{ 
    T(), // instance 1 
    T(), // instance 2 
}; 

int main() { 
    LargeConfig<int> obj1; 
    LargeConfig<POD1> obj2; 

    return 0; 
} 
1

、あなたは2つの問題を持って、私は二番目から始めましょう:

コードは、このようなものになります。

ManyTsはLargeConfigの正則メンバとして定義されています。つまり、クラスのコンストラクタで初期化する必要があります。例:私はPOD1

struct POD1 
{ 
    POD1(unsigned, unsigned); 
    unsigned _1{}; 
    unsigned _2{}; 
}; 

の定義次でそれをコンパイルするために管理して

template<typename T> 
LargeConfig<T>::LargeConfig() 
: ManyTs 
    { T(), // instance 1 
     T(), // instance 2 
     ... 
    } 
{} 

最初の問題は、のために推測することが困難ですが、私はあなたのいずれかのクラスか何かが含まれていないと思われますそうでなければこのクラスでは間違っていますが、私たちはそれを見ることができないので、言うのは難しいです。

関連する問題