Reputation: 4335
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
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
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 typedef
ed 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
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