2

申し訳ありませんが、私の質問に対してより適切なタイトルが見つかりませんでした。基本的に私が気づいたのは、次のコンパイルがうまくいったことです:

#include <vector>

void foo();

int main () {
    foo();
    return 0;
}

namespace{
struct point {
        double x, y;
    };
}

void foo(){       
    std::vector<point> p;
}

一方、コンパイラは次のことについて不平を言います。

#include <vector>

void foo();

int main () {
    foo();
    return 0;
}

void foo(){
    struct point {
        double x, y;
    };       
    std::vector<point> p;
}

// g++ output:
a.cpp: In function ‘void foo()’:
a.cpp:14: error: template argument for ‘template<class _Tp> class std::allocator’ uses local type ‘foo()::point’
a.cpp:14: error:   trying to instantiate ‘template<class _Tp> class std::allocator’
a.cpp:14: error: template argument 2 is invalid
a.cpp:14: error: invalid type in declaration before ‘;’ token

2番目のアプローチの何が問題なのか知りたいですか? 新しいオブジェクトstruct pointを作成する時点で完全に定義されていませんか?std::vector<point>

4

1 に答える 1

8

これは、C++03 の制限 (現在は C++11 で解除されています) によるもので、ローカル型 (つまり、関数本体で定義された型) をテンプレート引数として使用することを単純に禁止しています。

于 2012-08-06T22:54:56.103 に答える