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

我想知道第二种方法有什么问题?struct point在创建新std::vector<point>对象时没有完全定义吗?

4

1 回答 1

8

这是由于 C++03 中的限制(现在在 C++11 中取消),它简单地禁止使用本地类型(即在函数体中定义的类型)作为模板参数。

于 2012-08-06T22:54:56.103 回答