[英]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.