非类型模板参数

发布于 2025-01-02 18:26:55 字数 848 浏览 1 评论 0原文

我了解到:

  • 非类型模板参数带有一些限制。一般来说,它们可能是常量整数值(包括枚举)或指向具有外部链接的对象的指针。

因此我编写了以下代码

1。

 template <char const* name> 

 class MyClass { 
    … 
 }; 

 char const* s = "hello";  

 MyClass<s> x;         // ERROR:

此代码不起作用并产生错误's' 不是有效的模板参数

我的第二个代码也不起作用

2.

template <char const* name> 
class MyClass { 
  … 
}; 

extern char const *s = "hello";

MyClass<s> x;     //error 's' is not a valid template argument` 

但奇怪的是,这个代码很好

3.

template <char const* name> 
class MyClass { 
  … 
};

extern char const s[] = "hello";

MyClass<s> x;        // OK  

请告诉我什么是这三个代码都发生了?

还告诉我们如何纠正错误以使其他两个代码也能正常工作。

I have learned that:

  • Nontype template parameters carry some restrictions. In general, they may be constant integral values (including enumerations) or pointers to objects with external linkage.

So i made following code

1.

 template <char const* name> 

 class MyClass { 
    … 
 }; 

 char const* s = "hello";  

 MyClass<s> x;         // ERROR:

This code didn't work and produce error 's' is not a valid template argument

My second code also didn't work

2.

template <char const* name> 
class MyClass { 
  … 
}; 

extern char const *s = "hello";

MyClass<s> x;     //error 's' is not a valid template argument` 

But strangely this code is fine

3.

template <char const* name> 
class MyClass { 
  … 
};

extern char const s[] = "hello";

MyClass<s> x;        // OK  

please tell what is happening in all of these three codes??

also tell how to correct errors to make other two codes working also.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

千里故人稀 2025-01-09 18:26:55

来自 此处:“模板参数列表中提供的非类型模板参数是一个表达式,其值可以在编译时确定时间”。

你会遇到一个问题,因为你的 char 指针在前两个示例中并不是真正恒定的。看看这个简短的例子:

int main() {
        char const *c = "foor";
        std::cout << "c: " << c << std::endl;
        c = "bar";
        std::cout << "c: " << c << std::endl;
}

这会给你

c: foo
c: bar

From here: "Non-type template argument provided within a template argument list is an expression whose value can be determined at compile time".

You get a problem because your char pointer is not really constant in the first two examples. Have a look at this short example:

int main() {
        char const *c = "foor";
        std::cout << "c: " << c << std::endl;
        c = "bar";
        std::cout << "c: " << c << std::endl;
}

Which will give you

c: foo
c: bar
千と千尋 2025-01-09 18:26:55

我认为问题就在这里:
甚至

const char * const p="hello";

仅定义一个指针变量来存储内存的地址,编译时无法确定内存的值。

const char pp[]="你好";

编译器在编译时会知道内存是“hello”,而不是指向其他地方的指针。
这就是为什么

printf(" p=%p, &p=%p\n", p, &p);

将得到相同的值。
但是

printf("pp=%p, &pp=%p\n", pp, &pp);

不会显示相同的值。

I think the problem is here:
even

const char * const p="hello";

only define a pointer variable which stores the address of a memory, the value of the memory cannot be determined when compilation.
but

const char pp[]="hello";

the compiler will know when compile the memory is "hello", not a pointer to somewhere else.
that's why

printf(" p=%p, &p=%p\n", p, &p);

will get the same value.
but

printf("pp=%p, &pp=%p\n", pp, &pp);

will not show the same value.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文