[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Trouble debugging some STL code
From: |
address@hidden |
Subject: |
Re: Trouble debugging some STL code |
Date: |
Sun, 4 Feb 2018 19:23:14 -0800 (PST) |
User-agent: |
G2/1.0 |
On Tuesday, January 30, 2018 at 4:36:16 AM UTC+13, Richard Kettlewell wrote:
> "davin.pearson" writes:
>
> > The following code generates a linker error:
> [...]
>
> You’ve tried to explicitly instantiate a template, but got the syntax
> wrong. See
> https://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html for
> details.
>
> --
> https://www.greenend.org.uk/rjk/
Thank you for your helpful posting.
I've got another problem for you.
Here is my offending file:
#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <iterator>
#include <algorithm>
#include <string>
#include "../../2006/libd/string.hh"
class Writer
{
public:
friend Writer& operator << (Writer& w, const std::string& str)
{
w << str.c_str();
return w;
}
Writer& operator << (const dmp::string& str)
{
*this << str.const_char_star();
return *this;
}
Writer& operator << (const char* s)
{
for (const char* ch = s; *ch != 0; ++ch)
{
printf("%c",*ch);
}
return *this;
}
Writer& operator << (const int& i)
{
printf("%d",i);
return *this;
}
Writer& operator << (char ch)
{
printf("%c",ch);
return *this;
}
};
const char endl = '\n';
class File_Writer : public Writer
{
private:
FILE* f;
public:
File_Writer(FILE* f)
{
this->f = f;
}
};
File_Writer cout(stdout);
template<typename K>
Writer& operator << (Writer& w, const std::set<K>& set)
{
typename std::set<K>::const_iterator it = set.begin();
while (it != set.end())
{
w << *it << "\n";
it++;
}
return w;
}
template Writer& operator << (Writer& w, const std::set<std::string>& set);
int main()
{
std::set<std::string> myset;
myset.insert("eggplant");
myset.insert("xylophone");
myset.insert("apple");
myset.insert("carrot");
myset.insert("banana");
{
std::set<std::string>::iterator it = myset.find("banana");
if (it == myset.end())
{
cout << "Banana not found" << endl;
//std::cout << endl << *it; // SEGV:
//*it = "Fourth"; // NOT ALLOWED
}
else
{
cout << "Banana found\n";
cout << "it=" << *it << endl;
}
}
{
std::set<std::string>::iterator it = myset.find("xbanana");
if (it == myset.end())
{
cout << "xbanana not found" << endl;
//std::cout << endl << *it; // SEGV:
//*it = "Fourth"; // NOT ALLOWED
}
else
{
cout << "xbanana found\n";
cout << "it=" << *it << endl;
}
}
cout << "myset=" << myset << "\n";
return 0;
}
cd 2018/map/ && ./set6.exe
Banana found
xbanana not found
myset=apple
banana
carrot
eggplant
xylophone
Here is the contents of the dmp::string class:
http://davinpearson.com/binaries/string.hh
With dmp::string in place of std::string it returns the following
printout:
cd 2018/map/ && ./set6.exe
Banana not found
xbanana not found
myset=apple
banana
carrot
eggplant
xylophone
Why is it returning banana not found? (it is in the set).
- Re: Trouble debugging some STL code,
address@hidden <=