2016-08-01 47 views
1

的C2440錯誤(不能從「字符」到「Text_iterator」轉換該線路發生):範圍-for循環識別錯誤的類型(C2440)

void print(Document& d) 
{ 
    for (Text_iterator p : d) cout << *p; 
} 

更換「Text_iterator」與「汽車」給出'非法間接'錯誤(解除引用的類型必須是一個指針)。

類文檔定義了begin()和end()函數(返回Text_iterator),而Text_iterator具有通常的迭代器運算符。下面是代碼:

class Text_iterator 
{ 
    list<Line>::iterator ln; 
    Line::iterator pos; 
public: 
    // . . . 

    char& operator*() { return *pos; } 
    Text_iterator& operator++(); 

    // . . . 
}; 

和文檔:

struct Document 
{ 
    list<Line> line; 

    Text_iterator begin() 
    { 
     // . . . 
    } 

    Text_iterator end() 
    { 
     // . . . 
    } 

    // . . . 
}; 

回答

4

您正在使用不正確類型的循環變量。該變量不是容器的迭代器,但它是該容器的迭代器指向的內容。

如果你有

std::vector<int> foo(10); 

而且要使用一個遠程基於for循環,你會用

for (int e : foo) // or for (auto e : foo) 
    std::cout << e << " "; 

你不會使用

for (std::vector<int>::iterator e : foo) 
    std::cout << *e << " "; 

所以你需要使用不管Text_iterator指向而不是Text_iterator。在這種情況下,

void print(Document& d) 
{ 
    // if p is cheap to copy 
    for (auto p : d) cout << p; 
    // if p is expensive to copy 
    for (const auto& p : d) cout << p; 
} 

應該工作。

+0

或(更好恕我直言)'的(常量自動&P:d)COUT <

+0

@JesperJuhl好點。已添加到答案 – NathanOliver

3

range-for遍歷容器的內容。所以它不是關於迭代器,而是取消引用的迭代器。

你的代碼應該是:

void print(Document& d) 
{ 
    for (auto c : d) cout << c; 
} 

,或者如果你真的想保持控制權迭代器:

void print(Document& d) 
{ 
    for (auto p = d.begin(); p!=d.end(); p++) cout << *p; 
} 
+1

如果'p'是一個自定義迭代器類型,那麼'++ p'可能更可取(在任何情況下都是一個好的默認習慣)。 –