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++允许模板以静态存储为变量来获取变量的地址吗?由于内存地址是完整的,而那些具有静态存储的地址在编译时是已知的,所以这似乎是可能的_C++_Templates_Static - Fatal编程技术网

带静态存储的变量地址模板 C++允许模板以静态存储为变量来获取变量的地址吗?由于内存地址是完整的,而那些具有静态存储的地址在编译时是已知的,所以这似乎是可能的

带静态存储的变量地址模板 C++允许模板以静态存储为变量来获取变量的地址吗?由于内存地址是完整的,而那些具有静态存储的地址在编译时是已知的,所以这似乎是可能的,c++,templates,static,C++,Templates,Static,我发现这个问题表明这对int*有效 到目前为止,我还没有说服我的编译器接受指向其他类型的指针,比如char* 一般来说,模板可以专门用于静态地址吗?若否,原因为何 编辑:我应该更明确一些。下面是一些使用g++4.9为我编译的代码 #include <iostream> template<int* int_addr> struct temp_on_int{ temp_on_int() {} void print() { std::cout

我发现这个问题表明这对int*有效

到目前为止,我还没有说服我的编译器接受指向其他类型的指针,比如char*

一般来说,模板可以专门用于静态地址吗?若否,原因为何

编辑:我应该更明确一些。下面是一些使用g++4.9为我编译的代码

#include <iostream>

template<int* int_addr>
struct temp_on_int{
    temp_on_int() {}
    void print() {
        std::cout << *int_addr << std::endl;
    }
};


template<char* str_addr>
struct temp_on_string{
    temp_on_string() {}
    void print() {
        std::cout << str_addr << std::endl;
    }
};

static int i = 0;
static char j = 'h';
// static char* k = "hi";

int main() {

    temp_on_int<&i> five;
    i = 6;
    five.print();

    temp_on_string<&j> h;
    h.print();

    // temp_on_string<k> hi;
    // hi.print();
}
#包括
模板
内部结构温度{
temp_on_int(){}
作废打印(){

我从未见过,但我不这么认为。。。 我试图编译它,但它不起作用,我真的看不到它的用途,但这并不意味着它是不可能的


据我所知,静态变量需要定义,这样它们就可以用init进行初始化,这样就可以使用它(至少大多数时候是这样做的)…使用带有模板的静态函数也没有问题…只有静态变量,除非您找到在不知道模板类型的情况下初始化模板静态变量的方法,否则可能会这样做…

是的,但只有带有链接的静态地址才会初始化指针模板参数。您的
char*
可能无法使用字符串文字,因为它们没有链接

改用命名的,
extern
变量。

14.3.2
模板非类型参数[temp.arg.nontype]
1
非类型、非模板模板参数的模板参数应为以下参数之一:[……]
  • 一个常量表达式(5.19),用于指定一个完整文件的地址 具有静态存储持续时间和外部或内部链接的对象,或具有外部或内部链接的函数 内部联动装置
[...] 由于
k
不是常量表达式,因此不能将其用作模板参数

如果将
k的声明替换为

static char k[] = "hi";
clang++
编译它。
g++
没有;这是
g++
中的一个错误

如果
k
声明为

namespace { char k[] = "hi"; }

然后
g++
也编译它。

你是说你的编译器可以接受这个代码,但是如果你把
int
改成
char
,并且什么都不做,你的编译器就会拒绝它。问题不清楚-编辑过。你能再解释一下吗?你说没有链接是什么意思?这和sta有区别吗tic链接?这些关于指针模板参数的规则是在标准中明确规定的,还是由于其他原因产生的?@praxelitic“无链接”是由于字符串文字没有名称。该规则被n.m.Wow引用,很好的发现!我希望我能+2。