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

时间:2015-11-20 13:18:02

标签: c++ templates

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

简单地说我想这样做:

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放在它之前: / p>

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

它就像一个魅力。

1 个答案:

答案 0 :(得分:2)

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

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