www.digitalmars.com Home | Search | C & C++ | D | DMDScript | News Groups | index | prev | next
Archives

D Programming
D
D.gnu
digitalmars.D
digitalmars.D.bugs
digitalmars.D.dtl
digitalmars.D.dwt
digitalmars.D.announce
digitalmars.D.learn
digitalmars.D.debugger

C/C++ Programming
c++
c++.announce
c++.atl
c++.beta
c++.chat
c++.command-line
c++.dos
c++.dos.16-bits
c++.dos.32-bits
c++.idde
c++.mfc
c++.rtl
c++.stl
c++.stl.hp
c++.stl.port
c++.stl.sgi
c++.stlsoft
c++.windows
c++.windows.16-bits
c++.windows.32-bits
c++.wxwindows

digitalmars.empire
digitalmars.DMDScript

c++ - [bug?] intitialisation of array of structs

↑ ↓ ← Craig Bowlas <craigbowlas yahoo.co.uk> writes:
Hi,

The code ..

#include	"stdio.h"
using namespace std;
#include	<string>

struct	stuff
{
    string	a;
    string	b;
};

void	main	(void)
{
    stuff things[]=
    {
	{"bill","fred"},
	{"one","two2"},
	{"CD","DVD"}
    };
    
    for (int i=0; i<3;i++)
    {
	printf("item %d %s\n", i, things[i].b.c_str());
    }
}

produces the compiler errors 

        {"bill","fred"},
               ^
test.cpp(37) : Error: cannot find constructor for class matching
stuff::stuff(char const *)
        {"one","two2"},
              ^
test.cpp(38) : Error: cannot find constructor for class matching
stuff::stuff(char const *)
        {"CD","DVD"}
             ^
test.cpp(39) : Error: cannot find constructor for class matching
stuff::stuff(char const *)


If the types in the struct are built-ins (tested with int and char *)
and the initialisation array adjusted in the first case, the code
compiles and works as I would expect.

Is this a bug or am I being stupid?

Regards

Craig
Jun 16 2006
↑ ↓ Walter Bright <newshound digitalmars.com> writes:
Craig Bowlas wrote:
 #include	"stdio.h"
 using namespace std;
 #include	<string>
 
 struct	stuff
 {
     string	a;
     string	b;
 };

Any struct that has a member that has a constructor, must itself have a constructor. std::string has a constructor. Therefore, stuff must have a constructor.
Jun 17 2006
↑ ↓ Craig Bowlas <craig bowlas.demon.co.uk> writes:
On Sat, 17 Jun 2006 21:29:57 -0700, Walter Bright
<newshound digitalmars.com> wrote:

Craig Bowlas wrote:
 #include	"stdio.h"
 using namespace std;
 #include	<string>
 
 struct	stuff
 {
     string	a;
     string	b;
 };

Any struct that has a member that has a constructor, must itself have a constructor. std::string has a constructor. Therefore, stuff must have a constructor.

Thanks for the clarification, I found this issue while trying to rebuild a code::blocks nightly with dmc and so I went to plan B and attempted to use mingw/gcc for now. I have revisited the above and have added a constructor for the stuff struct, but I still get the same errors, the code now reads ... struct stuff { string a; string b; stuff(string c, string d); }; stuff::stuff(string c, string d) { a=c; b=d; }; void main (void) { stuff things[]= { {"john", "bill"}, {"2", "one"}, {"3", "CD"} }; for (int i=0; i<3;i++) { printf("item %d %s\n", i, things[i].b); } } _____ Craig Bowlas craig bowlas.demon.co.uk
Jun 20 2006
↑ ↓ Walter Bright <newshound digitalmars.com> writes:
Craig Bowlas wrote:
 On Sat, 17 Jun 2006 21:29:57 -0700, Walter Bright
 <newshound digitalmars.com> wrote:
 
 Craig Bowlas wrote:
 #include	"stdio.h"
 using namespace std;
 #include	<string>

 struct	stuff
 {
     string	a;
     string	b;
 };

constructor. std::string has a constructor. Therefore, stuff must have a constructor.

Thanks for the clarification, I found this issue while trying to rebuild a code::blocks nightly with dmc and so I went to plan B and attempted to use mingw/gcc for now. I have revisited the above and have added a constructor for the stuff struct, but I still get the same errors, the code now reads ... struct stuff { string a; string b; stuff(string c, string d); }; stuff::stuff(string c, string d) { a=c; b=d; }; void main (void) { stuff things[]= { {"john", "bill"},

try: stuff("john", "bill"),
 	{"2", "one"},
 	{"3", "CD"}
     };
     
     for (int i=0; i<3;i++)
     {
 	printf("item %d %s\n", i, things[i].b);
     }
 }
 _____
 Craig Bowlas                            craig bowlas.demon.co.uk

Jun 20 2006
↑ ↓ → Craig Bowlas <craig bowlas.demon.co.uk> writes:
On Tue, 20 Jun 2006 15:48:43 -0700, Walter Bright
<newshound digitalmars.com> wrote:

Craig Bowlas wrote:
 On Sat, 17 Jun 2006 21:29:57 -0700, Walter Bright
 <newshound digitalmars.com> wrote:
 
 Craig Bowlas wrote:
 #include	"stdio.h"
 using namespace std;
 #include	<string>

 struct	stuff
 {
     string	a;
     string	b;
 };

constructor. std::string has a constructor. Therefore, stuff must have a constructor.

Thanks for the clarification, I found this issue while trying to rebuild a code::blocks nightly with dmc and so I went to plan B and attempted to use mingw/gcc for now. I have revisited the above and have added a constructor for the stuff struct, but I still get the same errors, the code now reads ... struct stuff { string a; string b; stuff(string c, string d); }; stuff::stuff(string c, string d) { a=c; b=d; }; void main (void) { stuff things[]= { {"john", "bill"},

try: stuff("john", "bill"),
 	{"2", "one"},
 	{"3", "CD"}
     };
     
     for (int i=0; i<3;i++)
     {
 	printf("item %d %s\n", i, things[i].b);
     }
 }
 _____
 Craig Bowlas                            craig bowlas.demon.co.uk


Thanks Walter, that does indeed compile and run as expected, thanks again Regards Craig _____ Craig Bowlas craig bowlas.demon.co.uk
Jun 21 2006