phate
26-02-2009, 21:15
Hi zusammen,
als Sysadmin, sprich Nicht-C++-Programmierer beisse ich mir gerade die Zaehne an einem C++ Programm aus, das sich nicht mit meinem Sun Studio Compiler kompilieren lassen moechte, weil der die gaengige Version von std::distance nicht kennt.
Koennte daher mal bitte ein C++ Eingeweihter einen Blick auf den folgenden Schnipsel werfen und mir sagen, wie sich die Logik um std::distance so umbauen laesst, dass ein std::distance Aufruf mit 3 Argumenten bei rauskommt, wie er dem alten Prototyp
template <class InputIterator, class Distance>
void distance(InputIterator first, InputIterator last, Distance& n);
aus dem STL Standard genuegt [1]? Hier der relevante Schnipsel
std::string Message::Headers::operator[](const std::string header_) const
{
std::string retval;
std::string::iterator i;
if (this->rawContents.substr(0U, header_.size()) == header_)
{
retval = this->rawContents;
} else {
std::string tmp = "\r\n" + header_;
size_t position = this->rawContents.find(tmp);
if (position == std::string::npos)
return "";
retval = this->rawContents.substr(position + 2);
}
retval = retval.substr(retval.find(':') + 1);
while (isspace(retval[0]))
retval.erase(retval.begin());
for (i = retval.begin(); i != retval.end(); i++)
{
if (*i == '\r')
{
return retval.substr(0, std::distance(retval.begin(), i));
^^^^ Hierum gehts
}
}
return "";
}
Eigentlich muss doch nur eine Distance Variable definiert (und auf 0 gesetzt) werden, deren Zeiger man als 3. Argument an std::distance uebergibt. Eigentlich ..... mit meinen C-only-Kenntnissen scheiterts schon beim Definieren dieser Variable. :o Feedback ist daher sehr willkommen.
Umsteigen auf stlport4 fuers Kompilieren ist uebrigens leider keine Variante.
Sebastian
[1] http://www.sgi.com/tech/stl/distance.html
als Sysadmin, sprich Nicht-C++-Programmierer beisse ich mir gerade die Zaehne an einem C++ Programm aus, das sich nicht mit meinem Sun Studio Compiler kompilieren lassen moechte, weil der die gaengige Version von std::distance nicht kennt.
Koennte daher mal bitte ein C++ Eingeweihter einen Blick auf den folgenden Schnipsel werfen und mir sagen, wie sich die Logik um std::distance so umbauen laesst, dass ein std::distance Aufruf mit 3 Argumenten bei rauskommt, wie er dem alten Prototyp
template <class InputIterator, class Distance>
void distance(InputIterator first, InputIterator last, Distance& n);
aus dem STL Standard genuegt [1]? Hier der relevante Schnipsel
std::string Message::Headers::operator[](const std::string header_) const
{
std::string retval;
std::string::iterator i;
if (this->rawContents.substr(0U, header_.size()) == header_)
{
retval = this->rawContents;
} else {
std::string tmp = "\r\n" + header_;
size_t position = this->rawContents.find(tmp);
if (position == std::string::npos)
return "";
retval = this->rawContents.substr(position + 2);
}
retval = retval.substr(retval.find(':') + 1);
while (isspace(retval[0]))
retval.erase(retval.begin());
for (i = retval.begin(); i != retval.end(); i++)
{
if (*i == '\r')
{
return retval.substr(0, std::distance(retval.begin(), i));
^^^^ Hierum gehts
}
}
return "";
}
Eigentlich muss doch nur eine Distance Variable definiert (und auf 0 gesetzt) werden, deren Zeiger man als 3. Argument an std::distance uebergibt. Eigentlich ..... mit meinen C-only-Kenntnissen scheiterts schon beim Definieren dieser Variable. :o Feedback ist daher sehr willkommen.
Umsteigen auf stlport4 fuers Kompilieren ist uebrigens leider keine Variante.
Sebastian
[1] http://www.sgi.com/tech/stl/distance.html