質問

作成したクラスの染色体が結ばれるラッパーのためのベクターとostreamオペレーター、しいのかもしれないtypedefベクターです。しかし、うまくの分子を鋳型としostreamオペレーター...この最良の方法かけているのでしょうか?(私見を数アプローチとしての取得に失敗した他の仕事)

template<typename G>
class Chromosome {
 public:
  typedef typename std::vector<G> type;
  typedef typename std::pair<type *,type *> ptr_pair;
};

template<typename G> //line 19 below:
std::ostream& operator<<(std::ostream& os, const Chromosome<G>::type& chromosome) {
  for(auto iter = chromosome.begin(); iter != chromosome.end(); ++iter)
    std::cout << *iter;
  return os;
}

現在のエラーはいろんです:

chromosome.h:19: error: expected unqualified-id before ‘&’ token
chromosome.h:19: error: expected ‘)’ before ‘&’ token
chromosome.h:19: error: expected initializer before ‘&’ token

ございます!

役に立ちましたか?

解決

残念ながら、クリーンをすることがでのコンパイラで具の種類 G らの関数宣言

template<typename G>
std::ostream& operator<<(std::ostream& os, const typename Chromosome<G>::type& chromosome);

その理由はまった専門 Chromosome 異なる種類でき起状態のコンパイラな義明 G.例えば:

template <typename G> class Chromosome {
public:
    typedef std::vector<G> type; // No typename needed here, BTW
};

template <> class Chromosome<int> {
public:
    typedef std::vector<double> type;
};

などから持ち直している"というような出来事が起きないようにとだった。

vector<double> v;
cout << v << endl;

コンパイラのない場合 Gdouble または int この場合、両 Chromosome<int>Chromosome<double> してい vector<double> としての子タイプです。

この問題を修正するにはいいを明示的に使用タイプ vector<G> としての引数:

template<typename G>
std::ostream& operator<<(std::ostream& os, const std::vector<G>& chromosome);

残念ながら、あんなより良い方法を行っています。で、欠陥の言語であることを禁止するので、それは実は止まっています。

他のヒント

会員のtypedef type は被扶養者氏名:その意味は依存しないのに対してテンプレートパラメータ G.利用する必要があり typename のコンパイラが type 名前タイプ:

const typename Chromosome<G>::type&

の説明、検討の読み込みスタックオーバーフローのC++FAQ条 をどこに置くテンプレート"および"typenameの"依存性の名前.

として@templatetypedef塞へのコメントがこのコードをコンパイルではない"作品"きの挿入 std::vector<G>std::ostream ので type はnondeduced。

最も簡単な方法を宣言する過負荷の原因に予想される挙動は std::vector<G> 直接の引数の型:

template<typename G>
std::ostream& operator<<(std::ostream& os, const std::vector<G>& chromosome)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top