2013-07-08 43 views
0

我試圖使用模板函數來打印指向我的列表中的對象的屬性。獲取ostream模板以在指針列表中打印實例屬性

class SomeClass { 
    public: 
    double myVal; 
    int myID; 
} 

std::list< boost::shared_ptr<SomeClass> > myListOfPtrs; 
for (int i = 0; i < 10; i++) { 
    boost::shared_ptr<SomeClass> classPtr(new SomeClass); 
    myListOfPtrs.push_back(classPtr); 
} 

template < typename T > void printList (const std::list<T> &listRef) { 
    if (listRef.empty()) { 
    cout << "List empty."; 
    } else { 
    std::ostream_iterator<T> output(cout, " "); // How to reference myVal near here? 
    std::copy(listRef.begin(), listRef.end(), output); 
    } 
} 

printList(myListOfPtrs); 

什麼是打印,而不是指針地址。我知道我通常會做的就像(*itr)->myVal,但我不清楚如何調整模板功能。

+0

您正在打印指針,而不是對象。你期望打印什麼? – 0x499602D2

+0

我試圖打印一個屬性(如'myVal')指向的東西。 – Sarah

回答

0

首先,這裏不要使用shared_ptr。您的代碼並沒有給我們任何理由使用的內存管理:

std::list<SomeClass> myListofPtrs; 

然後,你需要提供自己的實現類的程序流插入操作的:

std::ostream& operator <<(std::ostream& os, SomeClass const& obj) 
{ 
    return os << obj.myVal; 
} 

如果您必須使用指針,然後您可以創建自己的循環:

for (auto a : myListOfPtrs) 
{ 
    std::cout << (*a).myVal << " "; 
} 
+0

我必須使用'shared_ptr'。我忽略了更大的背景。不幸的是,'std :: list > :: std :: cout <<(* iter).myVal << endl;':: iterator iter = listRef.begin(); ....'in代替模板也不起作用。我得到''class boost :: shared_ptr '沒有名爲'myVal'的成員 – Sarah

+0

需要成爲'(* iter) - > myVal'。 – Sarah

+0

@Sarah現在的代碼是否工作? – 0x499602D2