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

简而言之,我想这样做:

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:涉及具有内部链接的对象的表达式不能用作非类型参数。哪个似乎表明我不能在另一个文件中使用template参数? (我将所有类以不同的hpp分开)有什么想法吗?

解决了:为了解决该问题,我使用了下面的解决方案,并且(假设我的类(class)在单独的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;
}

关于c++ - 不能将类引用用作非类型模板参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33827713/

10-11 22:56
查看更多