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