即使使用强制转换,"也无法转换模板参数"错误的指针参数

gmy*_*gmy 6 c++ templates pointers

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

template< int *x > struct y { int *b; y() { b = x; }}
Run Code Online (Sandbox Code Playgroud)

我确实需要模板参数作为常量内存地址 - 它是一个嵌入式代码.如果我尝试像这样实例化它:(编译器是gcc 4.8.1 with -std = gnu ++ 11)

y< 1 > c;   
Run Code Online (Sandbox Code Playgroud)

我将得到一个错误"无法将模板参数'1'转换为'int*'",这很好,并且根据标准.我明白了.

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

y< (int *)1 > d;
y< reinterpret_cast<int *>(1) > e;
Run Code Online (Sandbox Code Playgroud)

错误:无法将模板参数'1u'转换为'int*'

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

qua*_*dev 4

根据 C++ 标准 \xc2\xa714.3.2 节,这是不允许的

\n\n
\n

非类型、非模板模板参数的模板参数应为以下之一:

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

解决方案

\n\n

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

\n\n
template< int *x > struct y \n{\n    int *b;\n    y() { b = x; }\n};\n\nextern int i;     // Extern\nstatic int j = 1; // Static\nint z = 1;        // Global\n\nint main() {\n    y< &i > c1;\n    y< &j > c2;\n    y< &z > c3;\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

活生生的例子在这里

\n