English 中文(简体)
为什么没有模板能够发挥当地的作用?
原标题:Why can t templates take function local types?

在C++中,由科索沃组成,具有地方职能:

int main() {
  struct S { static void M(const S& s) { } };
  S s;
  S::M(s);
}

但不包括科索沃的模板:

template<typename T> void Foo(const T& t) { }

int main() {
  struct S { } s;
  Foo(s);   // Line 5: error: no matching function for call to  Foo(main()::S&) 
}

没有任何关联的类型[......]不得用作模板的类型参数的模板标记。

为什么C++不能够做到这一点?


我迄今听到的最佳解释是,内部类型没有联系,这可能意味着把内部类型作为动力的职能必须没有任何联系。 但我没有理由认为,模板即时处理必须具有联系。


p.s. 请只字不提“

最佳回答

我猜测,是因为需要该模板在职能范围内有效即时,因为正是在这种类型明显的地方。 然而,与此同时,模板即时,如果它们处于界定模板的范围,则应当起到作用。 我确信,这样做可以处理这种 some,但如果我正确,标准机构决定不把这一负担交给汇编作者。

类似决定是以下原因:vector<vector<int>>按标准计算为无效的辛奈;发现施工需要汇编商法和末尔阶段之间的某种互动。 然而,这一变化是因为C++0x标准民间人士发现,所有汇编者都在发现这种标准,从而可以传递电解机错误信息。

我怀疑,如果能够证明这种建筑是三维的,而且它并没有在语言范围规则中引入任何模糊之处,那么你可能会看到这一标准也在这里发生变化。

问题回答

我认为,设想的困难在于两个即时的<代码>。 Foo<T> 实际含义完全不同,因为T对两者都相同。 很早就实施一些模板(包括先令),使用的是模板即时储存库,因此,如果发现存放处已经对此类材料进行即时处理,汇编者可以自动地在规定类型上公布一个模板。

为使这项工作与当地类型保持一致,存放处只能储存模板的类型,而只能做像为瞬时创造完整的“周”。 虽然这可能是可能的,但我认为,这被视为是很多额外工作,几乎没有(如果有的话)实际好处。

从那时起,这些规则已经做了足够的改动,即已经要求汇编者在不同的地点(包括在TUs各处)就同一类型的相同情况做一些事情,以便两个即时的<代码>foo<int>(例如) t不违反DR。 根据这一认识,这项限制在C++0x(目前草案)中松散(目前草案仍可在当地一级上调一个模板级,但你可以将当地类型作为模板功能的参数。





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?

热门标签