[英]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;
在這種情況下,編譯器無法確定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&
有關完整的解釋,請考慮閱讀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.