C++ Can';不要将类引用用作非类型模板参数
我在一个项目中,必须使用对常量模板对象的引用作为另一个对象模板的参数 简单地说,我想这样做:C++ Can';不要将类引用用作非类型模板参数,c++,templates,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; 我得到以下错误“C2131:表达式未计算为常量” 嗯,我确实尝试了一些我在其他帖
template<typename T>
class A {...}
template<typename T, A<T>& a>
class B {...}
int main(){
const A<int> a;
B<int, a> b;
我得到以下错误“C2131:表达式未计算为常量”
嗯,我确实尝试了一些我在其他帖子上看到的关于类似问题的事情,但不幸的是没有找到任何可以解决我问题的方法
我肯定是做错了什么,但不知道是什么
提前感谢您的帮助
编辑:我尝试了这个答案,但不幸的是,即使一开始看起来还可以,我在编译时也遇到了这个错误:C2970:包含具有内部链接的对象的表达式不能用作非类型参数。这似乎表明我不能在另一个文件中使用模板参数?(我把不同hpp的所有课程分开)有什么想法吗
已解决:为了解决这个问题,我使用了下面的解决方案(我假设因为我的类在一个单独的hpp文件中),只需在其前面添加关键字extern
:
extern const A<int> a;
int main(){ B<int, a> b; }
extern const A;
int main(){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;
}
模板
甲级{
公众:
A(){}
};
模板
B类{
公众:
B(){}
};
A A;
int main(){
B B;
}
Related它毫无意义。模板参数不能是引用。安德鲁:不幸的是,它是由项目强加的,所以它必须是template@HolyBlackCat它可以,但对于具有静态生存期的对象。@Quentin Oops,我没有料到这是可能的。OP使用的是非静态变量,所以这个答案不包括OPs问题。这就是为什么VS说它是错误的-解决方案是不使用局部变量,没有解释。这是一个只使用代码的答案,因此答案很差。谢谢你的回答Andrey。是否有可能找到一个解决方案,保持a;在main内部?因此a
现在具有静态存储持续时间,现在的问题是a
变为非本地。
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;
}