如何使用默认构造函数参数对模板进行typedef

How to typedef a template with a default constructor argument

本文关键字:typedef 何使用 默认 构造函数 参数      更新时间:2023-10-16

我试图对模板类进行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)

我是不是搞错了这个排版?有什么建议可以代替我做什么吗?

谢谢。

在C++中不可能做到这一点。

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

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

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

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

根据您在评论部分的描述,您正在尝试执行以下操作:

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) {}
};