Typedefとostreamオペレーターのためには、std::vector
質問
作成したクラスの染色体が結ばれるラッパーのためのベクターと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;
コンパイラのない場合 G
は double
または 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)