繁体   English   中英

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

[英]Can't use a class reference as a non-type template parameter

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

简单地说,我想这样做:

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: a variable with non-static storage duration cannot be used as an non-type argument”

如果我尝试使用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; }

它就像一个魅力。

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

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM