C++中使用本地类型作为模板参数

37

这是我的代码

#include <vector>
template <typename T, template<typename> class C = std::vector >
struct FooBar
{
   /*codez*/
};
template<typename T>
struct Global{};

int main()
{
   struct Local{};  
   FooBar<Local,Global> k;
}

我收到的错误信息如下:

template argument for ‘template<class T, template<class> class C> struct FooBar’ uses local type ‘main()::Local’

哪个标准部分说明这是错误的?我使用的是gcc 4.5.1。如何修正代码使其能够工作?


你是否使用 --std=c++0x 选项进行编译? - Travis Gockel
我不会使用那个选项。 - Ron Kanga
4
噢,那种能力直到C++0x才成为标准。详见N2657(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm)。只需添加该选项,g++就能与您愉快地合作了。 - Travis Gockel
局部类不能用作模板参数(直到C++11)。 - jw_
2个回答

33
哪一部分标准规定了这是错误的? 这将会是2003年C++标准的§14.3.1/2:
局部类型、没有链接的类型、没有名称的类型或由任何这些类型复合的类型,不应用作模板类型参数的模板参数。
如何使这段代码工作? 不要使用局部类型作为模板参数。 请注意,这个限制在C++11中被取消,因此在使用该语言标准时,您可以使用局部类型作为模板参数。

我使用了-std=c++0x选项,代码可以运行。但是如果我使用FooBar<Local> k;而不是FooBar<Local,Global> k;,我会收到一些错误。FooBar<Local> k有什么问题? - Ron Kanga
很高兴听到g++支持那个特性。至于FooBar<Local>的问题,是因为std::vector不是template <typename> class的有效模板模板参数,因为std::vector没有声明为std::vector<T>,而是声明为std::vector<T, Alloc> - James McNellis
@Ron:std::vector有_两个_模板参数。因此,template <typename T, template<typename, typename> class C = std::vector> struct FooBar { .. }; 在这里查看它的工作原理(http://www.ideone.com/9FQZP)。 - Lightness Races in Orbit

8

14.3.1/2

本地类型、无链接性的类型、未命名的类型或由这些类型组成的类型不得用作模板类型参数的模板实参。

尝试使用 -std=c++0x 选项(gcc 4.5.1)编译您的代码。C++0x取消了此限制,因此您可以将本地类型用作模板实参。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接