"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 ]

因此,如果您在前向声明中使用默认参数,则不能在模板本身上使用它。娱乐时间。

解决这个问题的一个方法是有一个额外的头文件,它只包含带有默认参数的模板的前向声明,并且所有使用该模板的文件都包含它,而不是模板的完整定义(直到需要完整的定义),包括模板的定义。模板定义不需要默认参数。不是很有趣,但它会起作用。

或者,不转发声明。

See examples here