我在一个项目中,必须使用对常量模板对象的引用作为另一个对象模板的参数。
简而言之,我想这样做:
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/