C++ &引用;无法转换模板参数";即使使用强制转换,指针参数也会出错

C++ &引用;无法转换模板参数";即使使用强制转换,指针参数也会出错,c++,templates,pointers,C++,Templates,Pointers,假设我有一个声明如下的模板类: template< int *x > struct y { int *b; y() { b = x; }} templatestruct y{int*b;y(){b=x;} 我确实需要模板参数是一个恒定的内存地址-它是一个嵌入式代码。 如果我尝试这样实例化它:(编译器是GCC4.8.1,带有-std=gnu++11) yc; 我将得到一个错误“无法将模板参数“1”转换为“int*”,这很好,符合标准。我明白 我的问题是,向指针转换也不起作用: y

假设我有一个声明如下的模板类:

template< int *x > struct y { int *b; y() { b = x; }}
templatestruct y{int*b;y(){b=x;}
我确实需要模板参数是一个恒定的内存地址-它是一个嵌入式代码。 如果我尝试这样实例化它:(编译器是GCC4.8.1,带有-std=gnu++11)

y<1>c;
我将得到一个错误“无法将模板参数“1”转换为“int*”,这很好,符合标准。我明白

我的问题是,向指针转换也不起作用:

y< (int *)1 > d;
y< reinterpret_cast<int *>(1) > e;
y<(int*)1>d;
ye;
错误:无法将模板参数“1u”转换为“int*”


在这两种情况下。为什么呢?模板参数已经转换了,不是吗?

< P>这是不允许的,按照C++标准,节〈4.3.2}/P> 非类型、非模板参数的模板参数应为以下参数之一:

  • 整型或枚举型的整型常量表达式;或
  • 非类型模板参数的名称;或
  • 具有外部链接的对象或函数的地址,包括函数模板和函数模板ID,但不包括 非静态类成员,表示为&id表达式,其中& 如果名称引用函数或数组,或者 对应的模板参数为参考; 或
  • 指向成员的指针,如5.3.1所述

解决方案

使用带有外部链接的变量作为模板参数:

template< int *x > struct y 
{
    int *b;
    y() { b = x; }
};

extern int i;     // Extern
static int j = 1; // Static
int z = 1;        // Global

int main() {
    y< &i > c1;
    y< &j > c2;
    y< &z > c3;
    return 0;
}
templatestruct y
{
int*b;
y(){b=x;}
};
外部内部i;//外行
静态int j=1;//静止的
int z=1;//全球的
int main(){
y<&i>c1;
y<&j>c2;
y<&z>c3;
返回0;
}

实例。

我不确定您的具体需求是什么,但我想您正在尝试为特定的硬件寄存器建模。这能满足你的需要吗

#include <cstdint>
template< uintptr_t x > struct y {
  int *const b;
  y() : b(reinterpret_cast<int*>(x)) {}
};      

int main() {
  y< 42 > c;
  return *c.b;  
}
#包括
模板结构y{
int*常数b;
y():b(重新解释_cast(x)){}
};      
int main(){
y<42>c;
返回*c.b;
}
#include <cstdint>
template< uintptr_t x > struct y {
  int *const b;
  y() : b(reinterpret_cast<int*>(x)) {}
};      

int main() {
  y< 42 > c;
  return *c.b;  
}