当前位置: 首页 > 知识库问答 >
问题:

具有一个参数和默认值的类模板

李森
2023-03-14

我一定错过了一些明显的东西,因为这真的让我大吃一惊。

以下代码给出了错误:error:a之前缺少模板参数

template<int n=0>
class A {};

...
A a;
...

是否有理由必须实例化一个带有1个默认值的参数的模板,并为其指定一个值?

有人能引用标准吗?

共有2个答案

颜杰
2023-03-14

如果伪装对象的性质很重要,可能的解决方法:

// the template class
template<int n=0>
class ReallyA {};

// an alias for the common case    
using A = ReallyA<0>;

A a;

例如,标准库就是这样定义std::string

using string = basic_string<char>;
芮安顺
2023-03-14

A仍然是一个模板类。但是您可以省略模板参数:

template<int n=0>
class A {};

int main() {
    A<> a;
  // ^^ 
    return 0;
}

观看现场演示。

我想相关的标准部分在这里

...
3可以为函数模板、类模板、类模板的成员或成员模板声明显式专门化。模板引入了显式专门化声明

 template<class T = int> struct A {
     static int x;
 };
 template<class U> void g(U) { }
 template<> struct A<double> { }; // specialize for T == double
 template<> struct A<> { }; // specialize for T == int
 template<> void g(char) { } // specialize for U == char
 // U is deduced from the parameter type
 template<> void g<int>(int) { } // specialize for U == int
 template<> int A<char>::x = 0; // specialize for T == char
 template<class T = int> struct B {
     static int x;
 };
 template<> int B<>::x = 1; // specialize for T == int

-[结束示例]

1)对不起,我找不到更好的标准引用/示例。它没有完全涵盖OP的情况,但至少说明了同样的情况,模板仍然需要

 类似资料:
  • 我试图理解下面的代码片段 当使用指针类型示例int*调用时,默认参数是如何工作的? 当obj1.test()被调用时,编译器将生成什么。我得到一个编译器错误当我尝试

  • 我想在模板类之外定义如下所述的函数。 已经为第二个参数尝试了很多组合,它是一个模板,并且也接受默认参数。 我希望它是在类之外定义的实际得到编译器错误,如果它是简单的类型,我可以很容易地在第二个参数中提到int、浮动等。

  • 是否允许在友元声明中为模板参数提供默认值? Visual Studio 2015似乎允许这样做。gcc拒绝了。我在cppreference页面上找不到任何内容。

  • 如果允许我执行以下操作: 为什么我主要不被允许做以下事情? 但我必须具体说明以下几点: C11引入了默认的模板参数,现在我完全无法理解它们。

  • 问题内容: 我可以在AngularJS中设置路由参数的默认值吗?有没有有办法,并通过相同的途径来处理? 我希望重构现有的代码,如下所示: 它可以工作,但不是很优雅。有没有更好的办法 ? 问题答案: 不允许使用路由参数的默认值。 但是(中的)路由 不应具有默认参数。 资源可以具有默认参数。 在如果你想使用一个可选的参数的路线,这实际上是两个不同的路线。 为什么? 路线应该很简单 路由不允许参数的正则

  • 我如何在从下面的API生成的swagger中定义属性的默认值? Swashbuckle生成OrderDirection作为所需参数。我希望它是可选的,并向客户机指示默认值(不确定swagger是否支持此选项)。 我不喜欢使属性类型为空。还有其他选择吗?理想情况下使用内置类... 我用的是虚张声势的皮带扣。AspNetCore-https://docs.microsoft.com/en-us/asp