Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';t std::vector是否采用本地类型? void foo(){ 结构Foo{..}; std::vector vec;//为什么这是非法的? }_C++_Vector_Local Class - Fatal编程技术网

C++ 为什么可以';t std::vector是否采用本地类型? void foo(){ 结构Foo{..}; std::vector vec;//为什么这是非法的? }

C++ 为什么可以';t std::vector是否采用本地类型? void foo(){ 结构Foo{..}; std::vector vec;//为什么这是非法的? },c++,vector,local-class,C++,Vector,Local Class,我不会让福回到外面的世界。它只是我在函数中使用的临时类型。本地类不能是模板参数。因为标准上说:- 14.3.1第2段: 本地类型、无链接的类型、未命名类型或 由这些类型中的任何一种混合而成的混合物不得用作混合物 模板类型参数的模板参数。“ [示例: 模板类X{/*…*/}; void f() { 结构S{/*…*/}; X x3;//错误:本地类型用作templateargument X x4;//错误:指向用作templateargument的本地类型的指针 } -结束示例][注意:模板类型参

我不会让福回到外面的世界。它只是我在函数中使用的临时类型。

本地类不能是模板参数。因为标准上说:-

14.3.1第2段: 本地类型、无链接的类型、未命名类型或 由这些类型中的任何一种混合而成的混合物不得用作混合物 模板类型参数的模板参数。“

[示例:
模板类X{/*…*/};
void f()
{
结构S{/*…*/};
X x3;//错误:本地类型用作templateargument
X x4;//错误:指向用作templateargument的本地类型的指针
}
-结束示例][注意:模板类型参数可能不完整
类型(3.9)。”

在C.L.C++中提出了一种解决方法。 更新: 有一些讨论为什么不可能将局部类作为模板参数?链接和C.S.D.C++的讨论是相同的。

简短回答: 因为C++标准是这样说的(章节<代码> 143.1)

长答覆: 在C++标准化的时候,C++标准委员会认为会有实施和性能问题。这些担心是毫无根据的,正如C++ 0x标准的最后草案一样,他们已经推翻了这个决定。
更实用的是,一些编译器已经支持新的C++0x规则:

  • 对于MacOSX,您需要gcc>=4.5,并带有
    -std=c++0x
    命令行参数
  • 对于Microsoft编译器,您需要>=vc8/VS2005而不带
    /Za
    选项(禁用语言扩展)

  • Anon:我可以知道你使用了什么编译器吗?@ Anon:我可以用Visual C++ 2005编译它,但是我想如果它真的在那里提到的话,我想这不符合标准。
    void foo() {
      struct Foo { .. };
      std::vector<Foo> vec; // why is this illegal?
    }
    
    [Example:
    template <class T> class X { /* ... */ };
    void f()
    {
    struct S { /* ... */ };
    X<S> x3; // error: local type used as templateargument
    X<S*> x4; // error: pointer to local type used as templateargument
    }
    -end example] [Note: a template type argument may be an incomplete
    type (3.9). ]"