This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

cannot pass objects of non-POD type


Hi.

I'm having trouble with the dreaded:
cannot pass objects of non-POD type 'sometype' through '...'
message. Here's a brief example:

class String {
public:
  void SetData(char *NewData) { m_Data = NewData; }
  char *m_Data;
};

int Bar(char *s, va_list ArgList)
{
  printf("String: %s\n", s);
  printf("Arg2: %s\n", va_arg(ArgList, char *));
}

int Foo(char *s, ...)
{
  va_list ArgList;
  va_start(ArgList, s);
  int Result = Bar(s, ArgList);
  va_end(ArgList);
  return Result;
}

int main(int argc, char **argv)
{
  String MyString;
  MyString.SetData("ghi");
  Foo("abc", MyString);
}

This works because String::m_Data is public. If I only change
it so that m_Data is private:

class String {
public:
  void SetData(char *NewData) { m_Data = NewData; }
private:
  char *m_Data;
};

The program now gives the dreaded warning, and crashes on execution.

Given that I know what I am doing (I am using the fact that String
has a single data member which is a pointer to character to copy just
that pointer to character to the argument list), is there any way to
accomplish this?

Is the crash a "real" crash, or is it a crash generated by the compiler
just to enforce passing non-PODness? It definitely seems like the latter.

The situation is this: I have a lot of code that uses a string class
which takes advantage of the pun: the string class has only the
one data member, which means you can do things like printf("%s", obj)
and have the right thing happen (using a different compiler, of course).
Is there any way to use this useful pun with g++?

Thanks,

j
-- 
John Gateley <gateley@jriver.com>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]