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