如何使用默认构造函数参数对模板进行typedef
How to typedef a template with a default constructor argument
我试图对模板类进行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) {}
};
- C++:TypeDef使用元组
- 为什么在使用typedef时类推导指南会失败
- 在类模板中使用 typedef 时出错
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何使用 typedef 创建多个数组?
- 使用智能指针指向 C 库中的结构,该结构通过 typedef 隐藏实现(即不完整的类型)
- 使用typedef有什么用,它意味着什么
- 如何将模板与Typedef一起使用
- 在 typedef 中使用相同的名称,并从命名空间使用
- 进行Typedef并使用模板实例化
- 如何在编译时检查两种类型是否相同(奖励点是否可与Boost strong typedef一起使用)
- C++ 如何通过可选的typedef,使用SFINAE或其他方式选择类
- Functors-如何将它们与typedef一起使用
- C++:我应该使用'typedef'还是"使用命名空间"?
- 在 typedef 上使用 sizeof 而不是局部变量
- 如何在 typedef 中使用模板化类的数据成员
- 在模板化类的typedef之后使用typename初始化函数时出错
- 除了自我引用,在typedef中使用标签还有其他原因吗?
- 我可以enable_if与typedef一起使用吗?