默认模板参数的非冲突重新定义
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 <class T = int> class A ;
时,您正在重新定义此默认参数,这就是您收到错误的原因。您必须选择一个位置来放置该默认参数(前向声明或实际定义)。
【讨论】:
同一个函数可以有多个声明,但默认参数不同(在不同的范围内)。 @Jarod42 没错,但是您并没有重新定义默认参数,因为在该上下文中您无法使用其他范围的参数! 这是给定示例的问题。前向声明中需要默认参数以在B
的定义中启用A<>
。为了清楚起见,A
(实际上位于另一个文件中)的以下定义中需要它...是否有解决方法来保持所需的代码清晰度?
@Jarod42 我不知道那个,然后删除了不正确的类比:)以上是关于默认模板参数的非冲突重新定义的主要内容,如果未能解决你的问题,请参考以下文章