2015-01-04 29 views
1

我想在我的Foo類上使用我的printContainer()。
我的printContainer在基本的stl :: vectors上運行良好,如main()所示。 我的Foo類的begin()end()成員函數似乎在main()的循環範圍內工作。
但是我無法在我的Foo類上調用我的printContainer()。錯誤是錯誤:呼叫沒有匹配函數「開始(
我在做什麼錯開始,簡單類迭代器的結束規範

#include <vector> 
#include <iostream> 

template <typename Iter, typename Cont> 
bool isLast(Iter iter, const Cont& cont) { 
    return (iter != cont.end()) && (next(iter) == cont.end()); 
} 

template <typename T> 
struct is_cont { 
    static const bool value = false; 
}; 
template <typename T,typename Alloc> 
struct is_cont<std::vector<T,Alloc> > { 
    static const bool value = true; 
}; 

template <typename T, typename std::enable_if< !is_cont<typename T::value_type>::value>::type* = nullptr > 
std::string printContainer(T const& container) 
{ 
    std::string str = "{"; 
    for (auto it = std::begin(container); it != std::end(container); ++ it) 
     str += (isLast(it, container) ? std::to_string(*it) + "}" : str += std::to_string(*it) + ","); 
    return str; 
} 

template <typename T, typename std::enable_if< is_cont<typename T::value_type>::value>::type* = nullptr > 
std::string printContainer(T const& container) 
{ 
    std::string str = "{"; 
    for (auto it = std::begin(container); it != std::end(container); ++ it) 
     str += (isLast(it, container) ? printContainer(*it) + "}" : str += printContainer(*it) + ","); 
    return str; 
} 

template <class T, class cmp=std::greater<T>> 
class Foo 
{ 
private: 
    std::vector<T> data_; 
public: 
    typedef typename std::vector<T>::value_type value_type; 

    Foo(size_t n, T val) : data_(n, val) {} 
    typename std::vector<T>::iterator begin(){ return data_.begin(); } // for printContainer 
    typename std::vector<T>::iterator end() { return data_.end(); } // for printContainer 
}; 

int main() 
{ 
    std::vector<std::vector<float>> a(2,std::vector<float>(3,3)); 
    std::cout << printContainer(a) << std::endl; // it works ! 

    Foo<float> b(10,2); 
    for (auto it = std::begin(b); it != std::end(b); it ++) 
     std::cout << *it << " "; // it works ! 

    // std::cout << printContainer(b) << std::endl; // but this does not work ! 
} 

回答

3

你傳遞一個const容器,所以你需要Foo::begin() constFoo::end() const成員函數

你?必須在Foo類的const成員增加,這反過來又返回常量迭代器:

typename std::vector<T>::const_iterator begin() const { return data_.cbegin(); } // for printContainer 
typename std::vector<T>::const_iterator end() const { return data_.cend(); } // for printContainer 

Live Demo

+0

哦謝謝...愚蠢的我...但是...怎麼會有這麼多print元素打印(b)?應該只有10. – coincoin

+0

@coincoin:那是另一個問題。被稱爲printcontainer是奇怪的遞歸,而不是其他。您可能想重新考慮實際的實施。 – quantdev

+0

好吧,我的錯誤,我只是糾正這個謝謝:) – coincoin