gpt4 book ai didi

c++ - Visual C++ 中模板参数的奇怪行为?

转载 作者:行者123 更新时间:2023-11-30 02:12:51 24 4
gpt4 key购买 nike

我尝试了 Nicolai M. Josuttis 的“C++ 模板 - 完整指南”中的这个示例

#include <iostream>

using namespace std;

template< typename T >
class List {
};

typedef enum { RED, GREEN, BLUE } *color_ptr;

int main() {
struct Local {
int x;
};

List< Local > l; // error : local type in template argument
List< color_ptr > l1; // error : unamed type in template argument.

return 0;
}

在 Ubuntu 9.04 下使用 g++,我遇到了编译器错误。然而,这段代码在 Visual C++ 2008 中编译成功。正如我从书中读到的:"模板类型参数是为模板类型参数指定的"值"。大多数常用类型都可以用作模板参数,但有两个异常(exception):1.局部类和枚举(换句话说,函数定义中声明的类型)不能包含在模板类型参数中。2. 涉及未命名类类型或未命名枚举类型的类型不能是模板类型参数(未命名类或枚举通过 typedef 声明被赋予名称是可以的。)那么 Visual C++ 有错误吗?

最佳答案

在许多其他情况下,您会发现这本书与 VC++ 的行为不同。示例是 typenametemplate 歧义工具以及将非常量引用绑定(bind)到右值。

在这种情况下,G++ 的行为当然是正确的,正如书中所说。尝试以下更改

typedef enum color_type { RED, GREEN, BLUE } *color_ptr;

template< typename T >
class List {
};

// not really local anymore :)
struct Local { int x; };
int main() {
List< Local > l;
List< color_type > l1;
}

下一个 C++ 标准 (C++0x) 允许本地类型作为模板参数。


请注意本书中使用 typedef 为类型命名的含义。这不适用于以下内容,因为名称 A 没有命名枚举类型,而是指向它的指针类型。

typedef enum { X } *A;

因此,当您使用 A 或在您的示例中使用 color_ptr 时,您就不安全了。从技术上讲,该名称是指向没有链接的类型的指针类型,不允许将其作为模板参数。


请注意,您可以将 Local 放入未命名的命名空间中,以使该类型成为当前翻译单元的本地类型,但该类型仍然可以作为类型模板参数接受。这样,如果您只想为函数对象之类的对象创建一个“临时”类型,则该结构不会与在不同文件中定义的结构发生冲突。

namespace {
// not really local anymore, but "translation unit local" :)
struct Local { int x; };
}

关于c++ - Visual C++ 中模板参数的奇怪行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1325763/

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