簡體   English   中英

用於std :: vector的Typedef和ostream運算符

[英]Typedef and ostream operator for a std::vector

我創建了一個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 ‘&’ 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&

有關完整的解釋,請考慮閱讀Stack Overflow C ++常見問題解答文章“將“模板”和“類型名”放在從屬名稱上的位置)

正如@templatetypedef在注釋中所暗示的那樣,盡管這將使代碼能夠編譯,但它不能“工作”以允許您將std::vector<G>插入到std::ostream因為type是非推斷的上下文。

聲明重載並獲得預期行為的最簡單方法是直接使用std::vector<G>作為參數類型:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM