MSVC无法识别继承模板类的模板类的“直接”基类构造函数

时间:2019-06-11 09:39:09

标签: c++ inheritance visual-c++

这不是此question的副本。

下面,我列出了我的基类以及如何从中派生一个类:

template<template<size_t, typename...> typename D>
struct Modifier
{
    // some static variables
};

template<typename M, size_t U, typename T, typename... S>
struct Base
{
    // some implementations
};

template<size_t U, typename T>
struct Derived;

template<>
struct Modifier<Derived>;

template<size_t U, typename T>
struct Derived : Base<Modifier<Derived>, U, T, double>
{
    using Base<Modifier<Derived>, U, T, double>::Base;
};

为了提供一些上下文,我们的想法是Base的实现将访问M的一些静态变量,以更改几个函数的行为。

当我使用msvc(构建工具v142)进行编译时,它抱怨:

1>...: error C3210:  'Base<Modifier<Derived<2,unsigned __int64> >,2,unsigned __int64,double>': a member using-declaration can only be applied to a base class member
1>...: error C3881:  can only inherit constructor from direct base

但是,当我介绍using mod_t = Modifier<Derived>;并将其应用到Derived的实现中而不是全名时,它将正确编译。

顺便说一句,无论我是像上面一样定义Derived还是像这样:

template<size_t U, typename T>
struct Derived : Base<Modifier<Derived>, U, T, double>
{
    using parent_type = Base<Modifier<Derived>, U, T, double>;
    using parent_type::Base;
};

template<size_t U, typename T>
struct Derived : Base<Modifier<Derived>, U, T, double>
{
    using parent_type = Base<Modifier<Derived>, U, T, double>;
    using parent_type::parent_type;
};

我仍然会收到错误消息。

我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

此问题(带有msvc)实际上与我之前的问题here有关:

  

避免注入类名的简单解决方法是使用全名。

在上面,Derived必须以::Derived为前缀,然后才能成功编译。