2014-07-21 26 views
0

檢查this答案後,我仍然似乎並沒有解決我的問題:迭代器複製構造函數錯誤,如右側'非法'。運營商

我現在有一個test_iterator結構,這將包裹不同類型的迭代器標籤到它讓我使用所有類型的迭代測試功能。當爲這個迭代器創建一個拷貝構造函數時,我的問題就出現了。當前的結構被定義爲

template <typename BaseIterator, typename IteratorTag> 
struct test_iterator 
    : boost::iterator_adaptor< 
     test_iterator<BaseIterator, IteratorTag>, 
     BaseIterator, boost::use_default, IteratorTag> 
{ 
private: 
    typedef boost::iterator_adaptor< 
     test_iterator<BaseIterator, IteratorTag>, 
     BaseIterator, boost::use_default, IteratorTag> 
    base_type; 

public: 
    test_iterator() : base_type() {} 
    test_iterator(BaseIterator base) : base_type(base) {}; 

    test_iterator(const test_iterator& cpy): 
     base_type(cpy.base_type) {}; 
}; 

最後一個構造函數(拷貝構造函數)是給我找麻煩,我似乎無法掌握我在做什麼錯。我收到確切的錯誤是

error C2274: 'function-style cast' : illegal as right side of '.' operator 

這是這一行:

base_type(cpy.base_type) {}; 
+0

你在測試函數或迭代器中的代碼嗎? –

+0

您沒有接受函數對象的構造函數。你確定你不是指base_type(cpy.base_type())嗎? – stix

+0

讓編譯器隱式地定義複製構造函數(以及移動構造函數,析構函數和複製/移動賦值)。 – Casey

回答

5

你不能對.右側的一個類型。您可以使用

test_iterator(const test_iterator& cpy) 
    : base_type(static_cast<base_type const&>(cpy)) {} 

...或者,考慮到基本類型已經指定,你可以只使用

test_iterator(const test_iterator& cpy) 
    : base_type(cpy) {} 
+0

但是,請注意,在'base_type'也有一個接受'const test_iterator&'(在這種情況下我可以很容易想象)的ctor的情況下,您顯示的兩種方式會有不同的行爲。 – Angew

1

在行

base_type(cpy.base_type) {}; 

您參考base_type,這是一個typedef,並且希望基礎迭代器。你需要調用由iterator_adaptor提供base()方法:

base_type(cpy.base()) {}; 
0
test_iterator(const test_iterator& cpy): 
    base_type(cpy.base_type) {}; 

test_iterator類沒有成員base_type,而是一個typedef base_type ,所以如果你真的想從稀薄空氣初始化基地,那將是

test_iterator(const test_iterator& cpy): 
    base_type(base_type()) {}; 

但是那樣會毫無意義,因爲那樣會產生相當於nullptr的效果。

我想你反而要實現的是

test_iterator(const test_iterator& cpy): 
     base_type(/*(const base_type&)*/cpy) {}; 

這是合法的,因爲從base_typetest_iterator繼承(我假設的基礎型實際上有一個副本構造函數採取base_type常量&);但是編譯器爲你做的事情就是沮喪,所以你不需要手動轉換它。


順便說一句 - 我認爲這

test_iterator(BaseIterator base) : base_type(base) {}; 

應該

test_iterator(const BaseIterator& base) : base_type(base) {}; 

應該不會吧。