如何使用默认构造函数参数键入def模板

时间:2014-04-29 17:04:34

标签: c++ typedef

我正在尝试键入一个模板类来接受一个默认的构造函数参数,但我遇到了一个错误。

这很好用:

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

但是,我希望这个类通过构造函数获取默认的字符串参数。我试过了:

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

这给了我一个胡思乱想的错误:error: expected initializer before ‘Writer’

我也试过这个:

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

给了我error: typedef ‘JARSS::DDS::Object::NetAcquire::MeasurandMetaData::Writer’ is initialized (use decltype instead)

我是否会对这种类型的错误感到错误?对于我能做什么有什么建议吗?

感谢。

3 个答案:

答案 0 :(得分:1)

无法在C ++中执行此操作。

考虑创建一个新类,向TransientWriter<DDS::NetAcquire::MeasurandMetaData, ::NetAcquire::MeasurandMetaDataTypeSupport_var, ::NetAcquire::MeasurandMetaDataTypeSupportImpl, ::NetAcquire::MeasurandMetaDataDataWriter, ::NetAcquire::MeasurandMetaDataDataWriter_var, ::NetAcquire::MeasurandMetaDataDataReader, ::NetAcquire::MeasurandMetaDataDataReader_var>的构造函数添加重载或创建工厂函数。

答案 1 :(得分:1)

看起来你试图滥用typedef来创建本质上是一个新的类声明 - 一个带有一个构造函数,该构造函数在typedef的类中不存在来自。

你不能这样做,因为那不是typedef所做的。 typedef确实创建了一个唯一类型 - 但是这个唯一类型实际上只是某个其他类型的别名。昵称,如果你愿意的话。

typedef也不会转换为执行的代码。也就是说,没有被调用的typedef 函数。它只是创建一个别名。

答案 2 :(得分:0)

根据您在评论部分中的说明,您尝试执行以下操作:

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

typedef A (10) MyA;

相反,您可以将A更改为:

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

如果您无法修改A,请创建一个子类,用您需要的内容初始化A

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

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