14
void foo() {
  struct Foo { .. };
  std::vector<Foo> vec; // why is this illegal?
}

私はFooを外の世界に戻すつもりはありません。これは、関数内で使用する一時的なタイプです。

4

2 に答える 2

14

ローカルクラスをテンプレート引数にすることはできません。標準が言うので:-

14.3.1段落2:「ローカル型、リンケージのない型、名前のない型、またはこれらの型のいずれかから複合された型は、テンプレート型パラメータのテンプレート引数として使用してはなりません。」

[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). ]"

clc++。moderatedで1つの回避策がここに提案されています。

更新:テンプレート引数としてローカルクラスを使用できない理由についていくつかの議論がありましたか?ここここのc.std.c++のリンクは、同じことを説明しています。

于 2010-03-18T07:30:39.990 に答える
3

簡単な答え: C ++標準がそう言っているので(セクション14.3.1

長い答え: C ++が標準化されたとき、C ++標準化委員会は、実装とパフォーマンスの問題があると信じていました。それらの恐れは根拠がないことが判明し、C ++ 0x標準の最終ドラフトの時点で、彼らは決定を覆しました。


より実用的な注意点として、一部のコンパイラはすでに新しいC++0xルールをサポートしています。

  • MacOSXの場合、-std=c++0xコマンドラインパラメーターを指定してgcc>=4.5が必要です。
  • Microsoftコンパイラの場合、オプションなしで> = vc8 / VS2005が必要です/Za(言語拡張機能を無効にする)
于 2010-03-30T16:33:36.917 に答える