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

不能将类引用用作非类型模板参数

鄢博简
2023-03-14

我在一个项目中,必须使用一个常量模板对象的引用作为另一个对象模板的参数。

简单地说,我想这样做:

template<typename T>
class A {...}

template<typename T, A<T>& a>
class B {...}

int main(){
   const A<int> a;
   B<int, a> b;

问题是我不知道如何让它发生,我需要你的帮助。

在visual studio上,上述代码将产生以下错误:“C2971:具有非静态存储持续时间的变量不能用作非类型参数”

如果我尝试使用 constexpr 而不是 const,则进行以下更改:

constexpr A<int> &a = A<int>(3);
B<int,a> b;

我得到以下错误“C2131:表达式未计算为常数”

好吧,我确实尝试了一些我在其他帖子上看到的关于类似问题的东西,但不幸的是没有找到任何可以解决我的问题的东西。

我肯定做错了什么,但不知道是什么。

提前感谢您的帮助!

编辑:我尝试了答案,但不幸的是,即使一开始看起来没问题,我在编译时也遇到了这个错误: C2970:涉及具有内部链接的对象的表达式不能用作非类型参数。这似乎表明我不能在另一个文件中使用模板参数?(我将不同hpp中的所有类分开)有什么想法吗?

已解决:为了解决这个问题,我使用了下面的解决方案,并且(我假设因为我的类在一个单独的hpp文件中)只需在它之前放置关键字extern即可:

extern const A<int> a;
int main(){ B<int, a> b; }

它就像一个魅力。

共有1个答案

侯善
2023-03-14

您不能使用局部变量作为模板类型定义的参数,不能本地化,它可以在局部变量范围之外使用。但是如果您将模板参数替换为引用全局变量,那将有效:

template<typename T>
class A {
  public:
    A() {}
};

template<typename T, A<T>& a>
class B {
  public:
    B() {}
};

A<int> a;
int main(){
  B<int, a> b;
}
 类似资料:
  • OpenGL定义了C函数来管理资源。我编写了一个简单的包装器来以RAII的方式处理它们。函数对类似于和。但是,也有一些函数对适用于资源数组,例如和。对于前者,我编写了一个简单的类来完成这项工作,对于后者,我编写了另一个处理数组的类。然而,我注意到有时我只使用一个缓冲区或纹理,在那里我不必承担向量的费用,我想如果发布函数在开始时采用大小参数,我会专门化类析构函数,但是... 对于上述SSCCE g树

  • 在C++98中,局部类和未命名类不能作为模板参数,这或许是一个负担,C++11则放宽了这方面的限制: void f(vector<X>& v) { struct Less { bool operator()(const X& a, const X& b) { return a.v<b.v; } }; // C++98: 错误: Less是局部

  • 我正在学习C 17非类型模板参数的新功能。我编写了一个简单的代码片段,如下所示: 据我所知,福 但是,语句使用clang、MSVC 19.27编译,但在GCC 10.2、MSVC 19.25编译时失败。 我的问题是:为什么编译器的行为不同?标准对此有何规定? 链接到编译器资源管理器: 叮当声https://godbolt.org/z/66M695 海湾合作委员会https://godbolt.or

  • 也许我累了,但是我被这个简单的局部特化卡住了,它不起作用,因为指定模板参数: 将替换为,或没有帮助。那么这种专门化是否可能呢?

  • 考虑以下示例: 而且,如果我们将非类型模板参数的类型改为占位符类型,如下所示: 然后,GCC接受,而Clang拒绝它(两者都拒绝,如上)。 海合会演示,铿锵演示。 (1)GCC HEAD 11.0.0 202 10117和Clang HEAD 12.0.0(20210118),。

  • 问题内容: 运行Demo类将在SomeClass中调用静态方法newInstance来调用构造函数并打印问候 定义方法将包括返回类型+方法名称以及参数 newInstance的返回类型是 SomeClass 在我看来很奇怪,因为我的班级叫做SomeClass 而不是 SomeClass 为什么在SomeClass 前面需要 ?看来,如果我不包含它,将会出现一个常见错误,称为“无法对非静态类型T进行