"too few template arguments error" 在 c++ 中使用带有默认模板参数的模板 class
"too few template arguments error" when using a template class with default template parameter in c++
我有一个 class 工作正常。我想将其更改为模板 class。假设我现在有:
template <MyTypes::smallType T = Mytypes::myInt>
class A{....}
现在假设 class A 在许多其他 hpp 和 cpp 文件中使用,有时通过包含头文件,有时通过前向声明为:
template <MyTypes::smallType T> class A;
并且在其他 classes 和函数调用中主要用作 std::shared_ptr<A<>>
。
现在假设我有另一个 class B,它与 A 非常相似,但使用的地方较少(通过前向声明仍在其他 cpp 文件中),而不是在 shared_ptr 中。
template <MyTypes::smallType T = Mytypes::myInt>
class B{....}
尝试编译时,我收到 A<>
的错误 "too few template arguments",但 B<>
没有。该项目非常大,我没有猜测来生成一个具有相同问题的简单示例。你能帮我吗(即使是猜测),可能是什么导致了这个问题?可以是shared_ptr吗?可以是typedef std::shared_ptr<A<>> APtr
形式的一些typedef吗?如果这有助于猜测,我也会收到错误 "unspecialized class template or generic can't be used as a template or generic argument for template or generic parameter 'param', expected a real type"。
非常感谢你的帮助。
很简单,前向声明需要默认参数。简单地这样看,简化形式:
template<class T> A;
std::shared_ptr<A<>> a;
当编译器看到这个时,这就是它所拥有的所有信息。因此,在这种情况下,A<>
显然缺少其模板参数的类型。现在,如果您这样做:
template<class T = int> A;
std::shared_ptr<A<>> a;
然后编译器可以推断出 A<>
确实是 A<int>
。
但这就是问题所在。来自 [temp.param]/12
A template-parameter shall not be given default arguments by two different declarations in the same scope.
[ Example:
template<class T = int> class X;
template<class T = int> class X { /* ... */ }; // error
—end example ]
因此,如果您在前向声明中使用默认参数,则不能在模板本身上使用它。娱乐时间。
解决这个问题的一个方法是有一个额外的头文件,它只包含带有默认参数的模板的前向声明,并且所有使用该模板的文件都包含它,而不是模板的完整定义(直到需要完整的定义),包括模板的定义。模板定义不需要默认参数。不是很有趣,但它会起作用。
或者,不转发声明。
我有一个 class 工作正常。我想将其更改为模板 class。假设我现在有:
template <MyTypes::smallType T = Mytypes::myInt>
class A{....}
现在假设 class A 在许多其他 hpp 和 cpp 文件中使用,有时通过包含头文件,有时通过前向声明为:
template <MyTypes::smallType T> class A;
并且在其他 classes 和函数调用中主要用作 std::shared_ptr<A<>>
。
现在假设我有另一个 class B,它与 A 非常相似,但使用的地方较少(通过前向声明仍在其他 cpp 文件中),而不是在 shared_ptr 中。
template <MyTypes::smallType T = Mytypes::myInt>
class B{....}
尝试编译时,我收到 A<>
的错误 "too few template arguments",但 B<>
没有。该项目非常大,我没有猜测来生成一个具有相同问题的简单示例。你能帮我吗(即使是猜测),可能是什么导致了这个问题?可以是shared_ptr吗?可以是typedef std::shared_ptr<A<>> APtr
形式的一些typedef吗?如果这有助于猜测,我也会收到错误 "unspecialized class template or generic can't be used as a template or generic argument for template or generic parameter 'param', expected a real type"。
非常感谢你的帮助。
很简单,前向声明需要默认参数。简单地这样看,简化形式:
template<class T> A;
std::shared_ptr<A<>> a;
当编译器看到这个时,这就是它所拥有的所有信息。因此,在这种情况下,A<>
显然缺少其模板参数的类型。现在,如果您这样做:
template<class T = int> A;
std::shared_ptr<A<>> a;
然后编译器可以推断出 A<>
确实是 A<int>
。
但这就是问题所在。来自 [temp.param]/12
A template-parameter shall not be given default arguments by two different declarations in the same scope.
[ Example: template<class T = int> class X; template<class T = int> class X { /* ... */ }; // error —end example ]
因此,如果您在前向声明中使用默认参数,则不能在模板本身上使用它。娱乐时间。
解决这个问题的一个方法是有一个额外的头文件,它只包含带有默认参数的模板的前向声明,并且所有使用该模板的文件都包含它,而不是模板的完整定义(直到需要完整的定义),包括模板的定义。模板定义不需要默认参数。不是很有趣,但它会起作用。
或者,不转发声明。