我正在进行一个项目,我必须使用对常量模板化对象的引用作为另一个对象模板的参数。
简单地说我想这样做:
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; }
它就像一个魅力。
答案 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;
}