gpt4 book ai didi

c++ - 依赖的非类型模板参数

转载 作者:可可西里 更新时间:2023-11-01 16:18:29 27 4
gpt4 key购买 nike

考虑以下类:

class Foo
{
enum Flags {Bar, Baz, Bax};

template<Flags, class = void> struct Internal;

template<class unused> struct Internal<Bar, unused> {/* ... */};
template<class unused> struct Internal<Baz, unused> {/* ... */};
template<class unused> struct Internal<Bax, unused> {/* ... */};
};

上面的类大纲在 VC++ 2010 和 Comeau C++ 上测试时按预期编译和运行。但是,当 Foo 本身成为模板时,上面的代码片段在 VC++ 2010 下会中断。

例如,下面的片段:

template<class> class Foo
{
// Same contents as the original non-templated Foo.
};

产生以下 error class :

C2754: 'Foo<<unnamed-symbol>>::Internal<Bar,unused>' : a partial specialization cannot have a dependent non-type template parameter
C2754: 'Foo<<unnamed-symbol>>::Internal<Baz,unused>' : a partial specialization cannot have a dependent non-type template parameter
C2754: 'Foo<<unnamed-symbol>>::Internal<Bax,unused>' : a partial specialization cannot have a dependent non-type template parameter

  1. 有人可以用通俗易懂的英语解释这里发生的事情吗?
  2. 如何在 VC++ 2010 上解决此问题(即,在模板化 Foo 中保留内部伪显式特化)?

最佳答案

How can I fix this (i.e., keep internal pseudo-explicit specializations in a templated Foo) on VC++ 2010?

您可以通过在非模板基类中声明它来使枚举类型成为非依赖的(C++03 使嵌套类依赖于 #108 但不包括枚举,但即使这样的代码也会仍然合法)。

struct FooBase { 
enum Flags {Bar, Baz, Bax};
};

template<class> class Foo : public FooBase {
template< ::FooBase::Flags, class = void > struct Internal;
// same other stuff ...
};

“错误类别”链接已经给出了应该出现错误的预期情况的描述。错误认为所有的依赖类型都是禁止的,但实际上标准是这样说的:

The type of a template parameter corresponding to a specialized non-type argument shall not be dependent on a parameter of the specialization.

因此,即使名称 Flags 会以某种方式依赖,只要它不依赖于特化的参数,就不会使其格式错误,就像您的示例中那样“错误类”链接。

关于c++ - 依赖的非类型模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3276596/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com