【问题标题】:Local type as template arguments in C++ [duplicate]本地类型作为 C++ 中的模板参数 [重复]
【发布时间】:2011-04-22 03:23:59
【问题描述】:

这是我的代码

#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&lt;class T, template&lt;class&gt; class C&gt; struct FooBar’ uses local type ‘main()::Local’

标准的哪一部分说这是错误的?我正在使用 gcc 4.5.1。如何使这段代码工作?

【问题讨论】:

标签: c++ templates


【解决方案1】:

标准的哪一部分说这是错误的?

这将是 2003 C++ 标准的 §14.3.1/2:

本地类型、无链接类型、未命名类型或由这些类型中的任何一种复合的类型不应用作模板类型参数的模板参数 .


如何使这段代码工作?

不要使用本地类型作为模板参数。

请注意,此限制已在 C++11 中解除,因此使用该语言标准,您可以使用本地类型作为模板参数。

【讨论】:

  • 我使用了-std=c++0x 选项并且代码有效。但是,如果我使用 FooBar&lt;Local&gt; k; 而不是 FooBar&lt;Local,Global&gt; k; 我会遇到一些错误。 FooBar&lt;Local&gt; k 怎么了?
  • 我很高兴听到 g++ 支持该功能。至于FooBar&lt;Local&gt;的问题,是因为std::vector不是template &lt;typename&gt; class的有效模板模板参数,因为std::vector没有声明为std::vector&lt;T&gt;,而是声明为std::vector&lt;T, Alloc&gt;
  • @Ron: std::vector两个 模板参数。所以,template &lt;typename T, template&lt;typename, typename&gt; class C = std::vector&gt; struct FooBar { .. }; 看到它工作了here
【解决方案2】:

14.3.1/2

本地类型、无链接类型、未命名类型或由这些类型中的任何一种复合而成的类型不得用作模板类型参数的模板参数。

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

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2020-12-20
    相关资源
    最近更新 更多