Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';不要将类引用用作非类型模板参数_C++_Templates - Fatal编程技术网

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;
}