默认模板参数的非冲突重新定义

Posted

技术标签:

【中文标题】默认模板参数的非冲突重新定义【英文标题】:Non-conflicting redefinition of default template argument 【发布时间】:2016-07-18 13:17:52 【问题描述】:

我了解(here 是一个来源)只要两个定义不冲突,就可以重新定义默认模板参数。所以,我正在尝试用 g++ 5.3.1 编译以下内容:

template <class = int> class A; // forward declaration
template <class T = A<>> struct B ;

template <class T = int> class A ; // "= int" here is for clarity

int main()  return 0; 

编译器抱怨:

错误:重新定义“class T”的默认参数

我的理解哪里不对?

【问题讨论】:

【参考方案1】:

您不能重新定义默认模板参数。

当您编写template &lt;class T = int&gt; class A ; 时,您正在重新定义此默认参数,这就是您收到错误的原因。您必须选择一个位置来放置该默认参数(前向声明或实际定义)。

【讨论】:

同一个函数可以有多个声明,但默认参数不同(在不同的范围内)。 @Jarod42 没错,但是您并没有重新定义默认参数,因为在该上下文中您无法使用其他范围的参数! 这是给定示例的问题。前向声明中需要默认参数以在B 的定义中启用A&lt;&gt;。为了清楚起见,A(实际上位于另一个文件中)的以下定义中需要它...是否有解决方法来保持所需的代码清晰度? @Jarod42 我不知道那个,然后删除了不正确的类比:)

以上是关于默认模板参数的非冲突重新定义的主要内容,如果未能解决你的问题,请参考以下文章

函数的非固定参数

C++ 模板详解(转)

错误:重新定义默认参数 [重复]

使用枚举和模板参数正确定义显式默认构造函数

C++11之模板别名&函数模板的默认模板参数

C++中,为啥函数参数不够也可以调用?而且函数模板定义中没有提供默认值。