C++ 0作为模板参数提供时不是有效的文件*

C++ 0作为模板参数提供时不是有效的文件*,c++,xcode,objective-c++,C++,Xcode,Objective C++,下面的代码 #include <stdio.h> template <typename T, T v> class Tem { T t; Tem() { t = v; } }; typedef Tem<FILE*,NULL> TemFile; 在MaCOS X上用XCu码编译.mf文件目标C++时,引发以下错误: 错误:无法将模板参数“0”转换为“文件*” 请问发生了什么事?所讨论的代码在MSVC下编译得很好

下面的代码

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

typedef Tem<FILE*,NULL> TemFile;

在MaCOS X上用XCu码编译.mf文件目标C++时,引发以下错误:

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


请问发生了什么事?所讨论的代码在MSVC下编译得很好。从什么时候开始,0常量不是指向任何对象的有效指针?这是不是一个目标C++的伪事实,而不是香草C++?< /p> < p>你试过这样的事吗?< /P>
typedef Tem<FILE*,((FILE*)NULL)> TemFile;

也许它正在试图找出NULL的类型。

您尝试过类似的方法吗

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

也许它正在试图找出NULL的类型。

根据标准,您运气不好。除了全局变量的地址外,无法初始化指向任何对象的指针参数。§14.3.2/1:

非类型的模板参数, 非模板参数应为 成为下列人员之一:

整型或枚举型的整型常量表达式;或 非类型模板参数的名称;或 具有外部链接的对象或函数的地址,包括 函数模板和函数 模板ID,但不包括非静态 类成员,表示为& id表达式,其中&是可选的 如果名称引用函数或 数组,或者如果 模板参数是一个参考;或 指向构件的指针,如5.3.1所述。 §14.3.2/5:

对于非类型的模板参数 类型指针指向对象、限定 转换4.4和 数组到指针转换4.2是 应用[注:特别是 空指针转换4.10 nor 导出到基的转换为4.10 已应用。尽管0是有效的 非类型的模板参数 整型模板参数, 它不是有效的模板参数 对于非类型的模板参数 指针类型。] 但是,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;

<> >对于更多的可移植性,您可能会考虑创建一个伪文件FILL NULL;通过&FILE_NULL,并用它而不是零来测试指针是否相等。

根据标准,您运气不好。除了全局变量的地址外,无法初始化指向任何对象的指针参数。§14.3.2/1:

非类型的模板参数, 非模板参数应为 成为下列人员之一:

整型或枚举型的整型常量表达式;或 非类型模板参数的名称;或 具有外部链接的对象或函数的地址,包括 函数模板和函数 模板ID,但不包括非静态 类成员,表示为& id表达式,其中&是可选的 如果名称引用函数或 数组,或者如果 模板参数是一个参考;或 指向构件的指针,如5.3.1所述。 §14.3.2/5:

对于非类型的模板参数 类型指针指向对象、限定 转换4.4和 数组到指针转换4.2是 应用[注:特别是 空指针转换4.10 nor 导出到基的转换为4.10 已应用。尽管0是有效的 非类型的模板参数 整型模板参数, 它不是有效的模板参数 对于非类型的模板参数 指针类型。] 但是,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;

<> >对于更多的可移植性,您可能会考虑创建一个伪文件FILL NULL;PASS和FILIONULL,以及指针相等的测试,而不是0。

对于它的价值,使用初始化列表初始化成员:TEM:TV{} HMM,代码看起来像香草C++。我认为目标C++看起来像是[可怕的东西]。或者说objective-OOC真不敢相信这是微软的专有扩展。整数模板参数也被禁止了吗?@Johannes:Haha,是的,这就是Objective-C.@Seva:是的|你应该如何实现一个安全的句柄类,然后,对于它的价值,使用初始化列表初始化成员:TEM:VT{H},代码看起来像香草C++。我认为目标C++看起来像是[可怕的东西]。或者说objective-OOC真不敢相信这是微软的专有扩展。整数模板参数也被禁止了吗?@Johannes:Haha,是的,这就是Objective-C.@Seva:是的|那么,您应该如何实现一个安全句柄类呢?这将抛出一个不同的错误
r:对整型或枚举类型以外的类型的转换不能出现在常量表达式中,这将引发不同的错误:对整型或枚举类型以外的类型的转换不能出现在常量中-expression@Johannes:谢谢,我错过了他们放进去的新要点,尽管关闭了C++0x,科莫还是接受了。@Johannes:谢谢,我错过了他们放进去的新要点,科莫尽管关闭了C++0x也接受了。