Tyler Jandreau
Tyler Jandreau

Reputation: 4335

How to typedef a template with a default constructor argument

I'm attempting to typedef a template class to accept a default constructor argument but I'm running into an error.

This works fine:

typedef TransientWriter<DDS::NetAcquire::MeasurandMetaData,
::NetAcquire::MeasurandMetaDataTypeSupport_var,
::NetAcquire::MeasurandMetaDataTypeSupportImpl,
::NetAcquire::MeasurandMetaDataDataWriter,
::NetAcquire::MeasurandMetaDataDataWriter_var,
::NetAcquire::MeasurandMetaDataDataReader,
::NetAcquire::MeasurandMetaDataDataReader_var> Writer;

However, I want this class to take a default string parameter through the constructor. I've tried:

typedef TransientWriter<DDS::NetAcquire::MeasurandMetaData,
::NetAcquire::MeasurandMetaDataTypeSupport_var,
::NetAcquire::MeasurandMetaDataTypeSupportImpl,
::NetAcquire::MeasurandMetaDataDataWriter,
::NetAcquire::MeasurandMetaDataDataWriter_var,
::NetAcquire::MeasurandMetaDataDataReader,
::NetAcquire::MeasurandMetaDataDataReader_var>
(::NetAcquire::MeasurandMetaDataTopic) Writer;

Which gives me a cranky error: error: expected initializer before ‘Writer’

And I've also tried this:

typedef TransientWriter<DDS::NetAcquire::MeasurandMetaData,
::NetAcquire::MeasurandMetaDataTypeSupport_var,
::NetAcquire::MeasurandMetaDataTypeSupportImpl,
::NetAcquire::MeasurandMetaDataDataWriter,
::NetAcquire::MeasurandMetaDataDataWriter_var,
::NetAcquire::MeasurandMetaDataDataReader,
::NetAcquire::MeasurandMetaDataDataReader_var>
Writer(::NetAcquire::MeasurandMetaDataTopic);

which gives me error: typedef ‘JARSS::DDS::Object::NetAcquire::MeasurandMetaData::Writer’ is initialized (use decltype instead)

Am I going about this typedef all wrong? Are there any suggestions for what I could do instead?

Thanks.

Upvotes: 0

Views: 1094

Answers (3)

R Sahu
R Sahu

Reputation: 206607

From your description in the comments section, you are trying to do something like:

struct A
{
   A(int a) : data(a) {}
};

typedef A (10) MyA;

Instead, you could change A to:

struct A
{
   A() : data(10) {}
};

If you are not able to modify A, create a sub-class that initializes A with what you need it to be:

struct A
{
   A(int a) : data(a) {}
};

struct MyA : public A
{
    MyA() : A(10) {}
};

Upvotes: 0

John Dibling
John Dibling

Reputation: 101456

It looks like you're trying to abuse typedef in order to create what is essentially a new class declaration -- one with a constructor that didn't exist in the class that is being typedefed from.

You can't do that because that's not really what typedef does. It's true that typedef creates a unique type -- but that unique type is really just an alias for some other type. A nickname, if you will.

typedef also doesn't translate in to code that executes. That is, there's no typedef function that gets called. It's really just creating an alias.

Upvotes: 1

user1804599
user1804599

Reputation:

It is not possible to do this in C++.

Consider creating a new class, adding an overload to the constructor of TransientWriter<DDS::NetAcquire::MeasurandMetaData, ::NetAcquire::MeasurandMetaDataTypeSupport_var, ::NetAcquire::MeasurandMetaDataTypeSupportImpl, ::NetAcquire::MeasurandMetaDataDataWriter, ::NetAcquire::MeasurandMetaDataDataWriter_var, ::NetAcquire::MeasurandMetaDataDataReader, ::NetAcquire::MeasurandMetaDataDataReader_var> or creating a factory function.

Upvotes: 1

Related Questions