3

コードによくわからない問題があります。

«gcc バージョン 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1)» を使用しています


編集:この行を使用してコンパイルします

g++ -g -std=c++0x -o "GeneticEngine.o" -c "GeneticEngine.cpp" 

これが私が持っているエラーです:

GeneticEngine.tpl:16:5: erreur: parenthesized initializer in array new [-fpermissive]

そして、それは私の(最小化された)コードです:


GeneticEngine.hpp

#include "GeneticThread.hpp"

template <class T>
class GeneticEngine
{
    public:
        template <typename ... Args>
        GeneticEngine(int nb_threads,float taux_mut,int tranche_mut,std::string filename,int pop_size,Args& ... args);

        /* Other code */


    private:
        GeneticThread<T>* islands; /* Cause of error */

        int size;
};

#include "GeneticEngine.tpl"

GeneticEngine.tpl

template <class T>
template <typename ... Args>
GeneticEngine<T>::GeneticEngine(int nb_threads,float taux_mut,int tranche_mut,std::string filename,int pop_size,Args& ... args) : size(nb_threads)
{
/*next line is 16 : Error */
 islands = new  GeneticThread<T>[size](taux_mut,tranche_mut,filename,pop_size/nb_threads,std::forward<Args>(args)...);
};

GeneticThread.hpp

template <class T>
class GeneticThread
{
    public:
        template <typename ... Args>
        GeneticThread(float taux_mut,int tranche_mut,std::string filename,int pop_size,Args& ... args)
        { /* code ... */ };
     /* Other code */
};

私はこれを読みました (テンプレートを使用する場合の配列の初期化 ) が、まったく同じではありません。

あなたが持っていなくてもそれを修正する考えがあるなら: [最後に私はこれを使用します:/]

GeneticThread<T>** islands;
islands = new  GeneticThread<T>*[size];
for(int i=0;i<size;++i)
   islands[i] = new GeneticThread<T>(taux_mut,tranche_mut,filename,pop_size/nb_threads,std::forward<Args>(args)...);

私がしたい:

 GeneticThread<T>* islands;

それを行う方法はありますか?

私は試します:

islands = new  (GeneticThread<T>[size](taux_mut,tranche_mut,filename,pop_size/nb_threads,std::forward<Args>(args)...));

 islands = new  GeneticThread<T>(taux_mut,tranche_mut,filename,pop_size/nb_threads,std::forward<Args>(args)...)[size];

しかし、うまくいきません。


ありがとう。

4

1 に答える 1

2

newly に割り当てられた配列にデフォルト以外のコンストラクターを使用することはできません。

newこのように使用する代わりにvector、適切に構築されたオブジェクトを使用してコンストラクターに渡すだけvectorです! サイズを変更する必要がない場合でもvector、メモリが適切に管理され、リークされていないことを確認します。

例えば:

std::vector<GeneticThread<T>*> islands;

それで:

GeneticEngine<T>::GeneticEngine(int nb_threads,float taux_mut,int tranche_mut,std::string filename,int pop_size,Args& ... args)
: size(nb_threads), islands(size, GeneticThread<T>(taux_mut,tranche_mut,filename,pop_size/nb_threads,std::forward<Args>(args)...))
{
};
于 2013-05-06T18:40:18.193 に答える