"初始化列表" vs。 "默认参数值"设置成员值时的差异

时间:2017-11-15 13:58:41

标签: c++ list arguments default initializer

我一直在项目中遇到链接问题,而且我找到了一个我无法解释的解决方法。

我有这种类,我在getType<>()上获得了一个未解析的外部符号,这是从另一个库中正确导入的。

MyClass( CustomType& iType = getType<OtherClass>() ) 
{...}

找到的解决方法可重用性稍差,但目前仍能很方便地满足我的用例。相同的链接器属性等。

MyClass( ) 
: mType( getType<OtherClass>() ) 
{...}
  • 使用默认参数值或通过初始化列表设置成员变量有何不同?
  • 范围有差异吗?例如可能是因为otherClassgetType<>()存在于不同的名称空间中?

编辑: getType声明:

template<typename type>
CustomType* getType() {
  static CustomType* oType = getType(typeid(type));
  return oType;
}

链接错误:

MyClass.obj : error LNK2019: unresolved external symbol "public: class CustomType * __thiscall Metadata::getType<class OtherClass>(void)" ...

1 个答案:

答案 0 :(得分:0)

默认参数仅在呼叫站点“exectuted”:因此对于

MyClass(CustomType& iType = getType<OtherClass>())

您只需要声明getType<OtherClass>()

仅当您使用以下内容时才会进行实例化:

MyClass myClass{}; // MyClass myClass{getType<OtherClass>()}

我认为getType<OtherClass>的定义不可访问。 (您可能在cpp文件中实现了模板)

对于

MyClass() : mType(getType<OtherClass>()) {}

getType<OtherClass>已实例化。