4

私はクラス Chromosome を作成しましたが、これは単に ostream 演算子を使用した vector のラッパーになったため、代わりに typedef vector を使用することにしました。ただし、テンプレート化された 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 ‘&amp;’ token
chromosome.h:19: error: expected ‘)’ before ‘&amp;’ token
chromosome.h:19: error: expected initializer before ‘&amp;’ token

乾杯。

4

2 に答える 2

7

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またはであるかどうかを判断できません。intChromosome<int>Chromosome<double>vector<double>

これを修正するには、型vector<G>を引数として明示的に使用する必要があります。

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

残念ながら、これを行うより良い方法は実際にはありません。それを禁止する十分な理由があるので、実際には言語の欠陥ではありませんが、実際には、このコンテキストでやりたいことができなくなります。

于 2011-02-12T01:47:37.357 に答える
1

メンバーtypedeftypeは依存名です。その意味は、テンプレートパラメーターに依存しますG。を使用して、型に名前を付けるtypenameコンパイラーに指示する必要があります。type

const typename Chromosome<G>::type&

完全な説明については、Stack Overflow C ++ FAQの記事、依存名に「テンプレート」と「タイプ名」を配置する場所を読むことを検討してください。

@templatetypedefがコメントでほのめかしているように、これによりコードをコンパイルできるようになりますが、非推定コンテキストにstd::vector<G>あるstd::ostreamため、に挿入できるように「機能」しませんtype

オーバーロードを宣言して期待される動作を取得する最も簡単な方法はstd::vector<G>、引数の型として直接使用することです。

template<typename G>
std::ostream& operator<<(std::ostream& os, const std::vector<G>& chromosome)
于 2011-02-12T01:36:50.053 に答える