By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,192 Members | 867 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,192 IT Pros & Developers. It's quick & easy.

How to define function which operates on iterator convertible toT*

P: n/a
Hello,

maybe my question is stupid, but...

I have function/algorithm which operates on sequence holding objects of
type T. The problem is that I do not know (at the declaration time)
which sequence (vector<T> or list<T>) will be used.

class element_t {
void some_method(void);
}

template <class InputIterator>
void visitor(InputIterator first, InputIterator last)
{
// some code
first->some_method(); // Error here
}

How can I specify that InputIterator is convertible to T*?

Thanks in advance, Ales
Jul 22 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
"AlesD" <al****@seznam.cz> wrote in message
news:cf**********@mrazik2.dkm.cz...
Hello,

maybe my question is stupid, but...

I have function/algorithm which operates on sequence holding objects of
type T. The problem is that I do not know (at the declaration time)
which sequence (vector<T> or list<T>) will be used.

class element_t {
void some_method(void);
}

template <class InputIterator>
void visitor(InputIterator first, InputIterator last)
{
// some code
first->some_method(); // Error here
}

How can I specify that InputIterator is convertible to T*?


What's the error? The following works just fine:

#include <list>

struct element_t {
void some_method(){}
};

template <class It>
void visitor(It beg, It end) {
beg->some_method();
}

int main() {
std::list<element_t> elems(1);
visitor( elems.begin(), elems.end() );
}

If the container holds pointers instead of instances of element_t, then you
should dereference the iterator before using operator->
((*beg)->some_method() instead of beg->some_method()).

--
David Hilsee
Jul 22 '05 #2

P: n/a
Hi,

I am using ostrstream object.I am using the str() function to get the char
buffer. The function is returning the pointer of char buffer , but it is
adding some garbage at the end. This behaviour is not predictable .
Sometimes it is returning the char buffer correctly , sometimes it is
returning the char buffer and some garbage attached to it at the end.I am
initialising the ostrstream object by fill('\0') function.

Can U please suggest some solution.

I am writing the code below for reference.

tBool clClusterCheckResults::logUplinkZeroCellError(cons t clCluster&
corfCluster,
RBINTValOrderedVector <int> a_vZCsNotRetained)
{
bool a_bReturnValue(false);
ostrstream myBuffer;
myBuffer.fill('\0');
a_bReturnValue = true;

myBuffer << corfCluster // << opearor is overloaded for clCluster class
<< " WARNING: The Cluster has no Uplink ZeroCells. "
<< " The following Zero Cells with Cobounding OC, with Uplinks are not
retained "
<< " in the higher level. (ZC Index) - ";

for(int iZeroCellIterator = 0 ;
iZeroCellIterator < a_vZCsNotRetained.length() ;
iZeroCellIterator++)
{
myBuffer << a_vZCsNotRetained[iZeroCellIterator] << " ";
}

myBuffer << "END\n";
cout<< "``````````PRINTING mybuffer logUplinkZeroCellError`````````\n";
cout<< myBuffer.str(); //Here the output is coming errorous
cout<< "``````````OVER``````````````````````````````````` ``````````\n";

m_oReport.logErrorMessage(myBuffer);

m_oResultsCounter.incrementErrorCount(
corfCluster.getLevel(),
UplinkZeroCellCheck,
"David Hilsee" <da*************@yahoo.com> wrote in message
news:pv********************@comcast.com...
"AlesD" <al****@seznam.cz> wrote in message
news:cf**********@mrazik2.dkm.cz...
Hello,

maybe my question is stupid, but...

I have function/algorithm which operates on sequence holding objects of
type T. The problem is that I do not know (at the declaration time)
which sequence (vector<T> or list<T>) will be used.

class element_t {
void some_method(void);
}

template <class InputIterator>
void visitor(InputIterator first, InputIterator last)
{
// some code
first->some_method(); // Error here
}

How can I specify that InputIterator is convertible to T*?
What's the error? The following works just fine:

#include <list>

struct element_t {
void some_method(){}
};

template <class It>
void visitor(It beg, It end) {
beg->some_method();
}

int main() {
std::list<element_t> elems(1);
visitor( elems.begin(), elems.end() );
}

If the container holds pointers instead of instances of element_t, then

you should dereference the iterator before using operator->
((*beg)->some_method() instead of beg->some_method()).

--
David Hilsee

Jul 22 '05 #3

P: n/a
News For Mohan wrote:
Hi,
Let me ask you right away, why did you reply to a completely unrelated
post instead of posting a new thread?

I am using ostrstream object.I am using the str() function to get the char
buffer. The function is returning the pointer of char buffer , but it is
adding some garbage at the end. This behaviour is not predictable .
Sometimes it is returning the char buffer correctly , sometimes it is
returning the char buffer and some garbage attached to it at the end.I am
initialising the ostrstream object by fill('\0') function.
There is no need to "initialise" an ostringstream object in any way.
The constructor for the ostringstream class takes care of that.

Can U please suggest some solution.
Drop the call to 'fill' for starters and RTFM about ostringstream class
to learn what 'fill' does to it.

I am writing the code below for reference.

tBool clClusterCheckResults::logUplinkZeroCellError(cons t clCluster&
corfCluster,
RBINTValOrderedVector <int> a_vZCsNotRetained)
{
bool a_bReturnValue(false);
ostrstream myBuffer;
myBuffer.fill('\0');
a_bReturnValue = true;

myBuffer << corfCluster // << opearor is overloaded for clCluster class
<< " WARNING: The Cluster has no Uplink ZeroCells. "
<< " The following Zero Cells with Cobounding OC, with Uplinks are not
retained "
<< " in the higher level. (ZC Index) - ";

for(int iZeroCellIterator = 0 ;
iZeroCellIterator < a_vZCsNotRetained.length() ;
iZeroCellIterator++)
{
myBuffer << a_vZCsNotRetained[iZeroCellIterator] << " ";
}

myBuffer << "END\n";
cout<< "``````````PRINTING mybuffer logUplinkZeroCellError`````````\n";
cout<< myBuffer.str(); //Here the output is coming errorous
cout<< "``````````OVER``````````````````````````````````` ``````````\n";

m_oReport.logErrorMessage(myBuffer);

m_oResultsCounter.incrementErrorCount(
corfCluster.getLevel(),
UplinkZeroCellCheck,

[...]

Jul 22 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.