gpt4 book ai didi

c++ - char* 具有内部链接,因此它不能不是非类型模板参数

转载 作者:行者123 更新时间:2023-11-30 02:34:08 25 4
gpt4 key购买 nike

一些我不明白的代码:

template<const char *T>
class A
{
};

const char *arr="hello world";

int main()
{
A<arr> obj;
}

此代码段无法编译。

visual studio 编译器 的错误消息是:

“A”的无效模板参数,预期的编译时常量表达式

g++ 的错误信息是:

'arr' 不是有效的模板参数,因为 'arr' 是一个变量,而不是变量的地址

对于 visual studio 编译器,即使我将 const 更改为 constexpr,该代码仍然无法编译。

这是为什么呢?这与那些内部链接外部链接 相关吗?(我从 C++ 模板 一书中读到这个,但不明白为什么和如何)

此外,将 const char *arr = "Hello world"; 更改为

const char arr[] = "Hello world";

external const char *arr="Hello world";

不会工作。

但是这行得通:external const char arr[]="Hello world";

最佳答案

这个问题比你做的要简单。 Visual Studio 编译器的错误信息其实很清楚。 arr 不是有效的模板参数,因为它不是编译时常量

为了将字符串用作模板非类型参数,它必须是具有外部链接的变量(尽管我相信 C++11 确实删除了这一要求——参见 Columbo's answer)。因此,您可以将代码更改为以下内容,它会起作用:

template <const char* T>
class A
{
// ...
};

extern const char arr[] = "hello world";

int main()
{
A<arr> obj;
}

注意 arr 的声明是如何改变的。该变量现在是一个具有外部链接的命名对象,因此它可以用作模板非类型参数。

基本上,发生的事情是将其地址 传递给模板。这意味着决定其唯一性的不是字符串的内容,而是对象本身。换句话说,如果您有两个包含完全相同字符串的不同变量,它们仍然会有不同的类型并创建模板类的两个不同实例。

关于c++ - char* 具有内部链接,因此它不能不是非类型模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34788138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com