編輯。請看我的評論。C++模板集合類型
我一直在努力與此一段時間了。我一直在編寫一個mergesort例程,對矢量進行操作(坦率地說,重新發明了這個輪子),並且我一直在將迭代器傳遞給我的排序函數。在排序功能中,我創建了一個臨時向量。現在,我希望它對任何元素類型進行操作,因爲代碼中沒有特定於int/double等的內容。我似乎無法讓我的模板定義工作。我已經嘗試了許多不同的方式來做到這一點。如果有人可能看看我寫在下面的小片段,並告訴我如何讓它工作,以便我可以接受vector :: iterator作爲函數參數,然後在函數本身中聲明和使用矢量,我真的很感激它。
#include <vector>
using namespace std;
template <typename T>
void test(vector<T>::iterator myiter) {
typename vector<T> myvec;
}
這裏是我的編譯時錯誤:
$ make tmpl
g++ -Wall -ggdb --std=c++11 tmpl.cc -o tmpl
tmpl.cc:5:22: error: variable or field ‘test’ declared void
void test(vector<T>::iterator myiter) {
^
tmpl.cc:5:31: error: expected ‘)’ before ‘myiter’
void test(vector<T>::iterator myiter) {
如果它的任何利益,這是完整的清單我正在使用的當前快照 - 和合並()是一個我正在掙扎着。我已經多次與不同類型的改變的模板語法失敗:
#include <iostream>
#include <vector>
template <typename Iter>
void print_collection(Iter start, Iter end) {
std::cout << "collection = { ";
for(; start != end; ++start) {
std::cout << *start << ", ";
}
std::cout << "};" << std::endl;
}
template <typename T>
void merge(std::vector<T>::iterator start, std::vector<T>::iterator pivot, std::vector<T>::iterator end, int left_len, int right_len) {
std::vector<T> temp;
std::vector<T>::iterator i, j;
i = start;
j = pivot;
while(i != pivot && j != end) {
if(*i <= *j) {
temp.push_back(*i);
++i;
} else if(*i > *j) {
temp.push_back(*j);
++j;
}
}
for(; i != pivot; ++i) {
temp.push_back(*i);
}
for(; j != end; ++j) {
temp.push_back(*j);
}
i = start;
j = temp.begin();
for(; i != end, j != temp.end(); ++i, ++j) {
*i = *j;
}
}
template <typename Iter>
void merge_sort(Iter start, Iter end, int len) {
if(len <= 1) {
return;
}
int odd, left_len, right_len;
Iter pivot;
odd = len % 2;
left_len = (len/2) + odd;
pivot = start + left_len;
right_len = len/2;
merge_sort(start, pivot, left_len);
merge_sort(pivot, end, right_len);
merge(start, pivot, end, left_len, right_len);
}
int main(void) {
std::vector<double> vl = { 1.1, 9.1, 2.1, 8.1, 3.1, 7.1, 4.1, 6.1, 5.1, 0.1 };
print_collection(vl.begin(), vl.end());
merge_sort(vl.begin(), vl.end(), vl.size());
print_collection(vl.begin(), vl.end());
return 0;
}
,這裏是從全面上市編譯錯誤:
$ make vec
g++ -Wall -ggdb --std=c++11 vec.cc -o vec
vec.cc:39:28: error: variable or field ‘merge’ declared void
void merge(std::vector<T>::iterator start, std::vector<T>::iterator pivot, std::vector<T>::iterator end, int left_len, int right_len) {
^
vec.cc:39:37: error: expected ‘)’ before ‘start’
void merge(std::vector<T>::iterator start, std::vector<T>::iterator pivot, std::vector<T>::iterator end, int left_len, int right_len) {
^
vec.cc:39:69: error: expected ‘)’ before ‘pivot’
void merge(std::vector<T>::iterator start, std::vector<T>::iterator pivot, std::vector<T>::iterator end, int left_len, int right_len) {
^
vec.cc:39:101: error: expected ‘)’ before ‘end’
void merge(std::vector<T>::iterator start, std::vector<T>::iterator pivot, std::vector<T>::iterator end, int left_len, int right_len) {
^
vec.cc:39:106: error: expected primary-expression before ‘int’
void merge(std::vector<T>::iterator start, std::vector<T>::iterator pivot, std::vector<T>::iterator end, int left_len, int right_len) {
^
vec.cc:39:120: error: expected primary-expression before ‘int’
void merge(std::vector<T>::iterator start, std::vector<T>::iterator pivot, std::vector<T>::iterator end, int left_len, int right_len) {
^
vec.cc: In instantiation of ‘void merge_sort(Iter, Iter, int) [with Iter = __gnu_cxx::__normal_iterator<double*, std::vector<double> >]’:
vec.cc:88:45: required from here
vec.cc:81:47: error: ‘merge’ was not declared in this scope
merge(start, pivot, end, left_len, right_len);
^
我已經花了很多年看着我認爲是重複的鏈接問題。在決定問我的問題之前,我花了一段時間進行交易,我想我已經提出了一個非常具體的問題,並將相當數量的工作簡單地提出來,足以證明它被視爲一個完全不同的問題。我很欣賞我可能錯過了模板的基本點,並且鏈接的答案對我沒有多大幫助。我不是那種經驗豐富的C++,如果有人能指出我正確的方向 –