gpt4 book ai didi

c++ - 0 当作为模板参数提供时不是有效的 FILE*

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:21 25 4
gpt4 key购买 nike

下面的代码

#include <stdio.h>
template <typename T, T v> class Tem
{
T t;
Tem()
{
t = v;
}
};

typedef Tem<FILE*,NULL> TemFile;

在 MacOS X 上通过 Xcode 在 .mm 文件 (Objective C++) 中编译时,抛出以下错误:

错误:无法将模板参数“0”转换为“FILE*”。

请问这是怎么回事?有问题的代码在 MSVC 下编译得很好。从什么时候开始 0 常量不是指向任何东西的有效指针?这是 Objective C++ 的产物(相对于 vanilla C++)吗?

最佳答案

按照标准,你倒霉了。除了全局地址之外,没有办法将指针参数初始化为任何东西。 §14.3.2/1:

A template-argument for a non-type, non-template template-parameter shall be one of:

  • an integral constant-expression of integral or enumeration type; or
  • the name of a non-type template-parameter; or
  • the address of an object or function with external linkage, including function templates and function template-ids but excluding non-static class members, expressed as & id-expression where the & is optional if the name refers to a function or array, or if the corresponding template-parameter is a reference; or
  • a pointer to member expressed as described in 5.3.1 .

§14.3.2/5:

  • for a non-type template-parameter of type pointer to object, qualification conversions (4.4) and the array-to-pointer conversion (4.2) are applied. [Note: In particular, neither the null pointer conversion (4.10) nor the derived-to-base conversion (4.10) are applied. Although 0 is a valid template-argument for a non-type template-parameter of integral type, it is not a valid template-argument for a non-type template-parameter of pointer type. ]

但是,Comeau 接受这种无效的解决方法:

typedef Tem<FILE*, (FILE *) NULL > TemFile;

而且这段代码符合标准的可能性很小:我找不到标准在哪里明确指出逐字使用默认表达式来代替缺少的参数,而且我找不到匹配的已知缺陷。有人有引用吗?

#include <stdio.h>
template <typename T, T *v = (T*) 0> class Tem
{
T t;
Tem()
{
t = v;
}
};

typedef Tem<FILE> TemFile;

为了更好的可移植性,您可以考虑创建一个伪造的 FILE FILE_NULL;,传递 &FILE_NULL,并使用它而不是零来测试指针是否相等。

关于c++ - 0 当作为模板参数提供时不是有效的 FILE*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2548887/

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