考虑以下课程:
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
Foo
中保留内部伪显式特化)?答案 0 :(得分:4)
如何在VC ++ 2010上修复此问题(即在模板化的Foo中保留内部伪显式特化)?
您可以通过在非模板基类中声明枚举类型来使其不依赖(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 ...
};
“错误类”链接已经提供了应该提高错误的预期情况的描述。该错误认为所有依赖类型都是被禁止的,但实际上这就是标准所说的:
与专用非类型参数对应的模板参数的类型不应取决于特化的参数。
因此,即使名称Flags
以某种方式依赖,只要它不依赖于特殊化的参数(例如“错误类”的示例),也不会使其形成错误“链接。