自定义插入方法不适用于std :: inserter

时间:2019-05-26 19:32:04

标签: c++

我有一个自定义类,它的行为基本上像set,但是我需要添加一些功能。我不知道此建议是否适用于布景,但在reading关于最好不要继承自std::vector更好的方式之后,我决定放心使用它,并且只将set设为私人我类中的成员变量,并通过适当的操作。但是,当我像使用insert一样需要定义std::inserter方法think时,会出现错误。此外,我不能重载该方法,不允许提供insert所采用的多种形式。我无法从make解密输出消息。

示例代码:

#include <cstdio>                                                                                                          
#include <set>                                                                                                             
#include <algorithm>                                                                                                       

class Test {                                                                                                               
public:                                                                                                                    

    Test() {};                                                                                                             

    Test(const std::set<int>& inset) {                                                                                     
        set_ = inset;                                                                                                      
    };                                                                                                                     

    std::set<int>::const_iterator begin() const {return set_.begin();};                                                    
    std::set<int>::const_iterator end() const {return set_.end();};                                                        
    std::set<int>::iterator insert(std::set<int>::iterator hint, const int& value) {                                                                                        
        return set_.insert(hint, value);                                                                                   
    };                                                                                                                     

private:                                                                                                                   
    std::set<int> set_;                                                                                                    
};                                                                                                                         


int main(int argc, char **argv) {                                                                                          
    Test a = std::set<int>({1, 2, 3, 4, 4, 4, 5, 5});                                                                      
    Test b = std::set<int>({ 2, 3, 5});                                                                                    
    Test c;                                                                                                                

    std::set_difference(a.begin(), a.end(), b.begin(), b.end(),                                                            
            std::inserter(c));                                                                                             

    return 0;                                                                                                              
}  

根据cppreference列出的原型,我尝试了insert的各种版本。

set.cc: In function ‘int main(int, char**)’:
set.cc:31:28: error: no matching function for call to ‘inserter(Test&)’
             std::inserter(c));
                            ^
set.cc:31:28: note: candidate is:
In file included from /usr/include/c++/4.8.2/bits/stl_algobase.h:67:0,
                 from /usr/include/c++/4.8.2/bits/stl_tree.h:61,
                 from /usr/include/c++/4.8.2/set:60,
                 from set.cc:2:
/usr/include/c++/4.8.2/bits/stl_iterator.h:683:5: note: template<class _Container, class _Iterator>
std::insert_iterator<_Container> std::inserter(_Container&, _Iterator)
     inserter(_Container& __x, _Iterator __i)
     ^
/usr/include/c++/4.8.2/bits/stl_iterator.h:683:5: note:   template argument deduction/substitution failed:
set.cc:31:28: note:   candidate expects 2 arguments, 1 provided
             std::inserter(c));
                            ^

0 个答案:

没有答案