c++ - 不能使用类引用作为非类型模板参数

标签 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;

问题是我不知道如何实现它,我需要你的帮助。

在 Visual Studio 上,上述代码将产生以下错误:“C2971:具有非静态存储持续时间的变量不能用作非类型参数”

如果我尝试使用 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;
}

关于c++ - 不能使用类引用作为非类型模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33827713/

相关文章:

c++ - 在析构函数上自动安全地清除 C++ std::string 和 std::vector 的内容

c++ - 为什么 is_default_constructible<Class>::value 在同一类范围内失败

c++ - 函数用完时结构会归零吗?

c++ - cmake 在 Windows 上找不到 openssl

c++ - 成员函数模板参数默认值

c++ - 递归模板实例化超过最大深度 256

c++ - 更改复数输出格式

c++ - 模板类型略有变化后继承特征类

java - 为什么 Play 框架模板可以访问私有(private)字段?

java - NetBeans 无法识别许可证模板中的 ${project.organization}