【问题标题】:c++ template - type/value mismatch - Instantiate base class template with a type dependent on derived classc++ 模板 - 类型/值不匹配 - 使用依赖于派生类的类型实例化基类模板
【发布时间】:2018-04-11 00:51:18
【问题描述】:

以下代码无法编译并出现类型/值不匹配错误,但我知道提供了一个类型。我错过了什么?

template<typename A, typename B>
struct base {};

template<typename B>
struct derived : base< derived<B>::type, B >
{
  using type = int;
}

int main()
{
  derived<char> d;
}

error: type/value mismatch at argument 1 in template parameter
list for 'template<class A, class B> struct base'
struct derived : base< derived<B>::type, B >

note: expected a type, got 'derived<B>::type'

为什么derived&lt;B&gt;::type 不是有效类型?

此外还尝试了以下方法:

template<typename B>
struct derived : base< typename derived<B>::type, B >
{
  using type = int;
}

并得到以下错误:

no type name 'type' in 'struct derived<char>'

为什么编译器检测不到类型?

【问题讨论】:

    标签: c++ templates inheritance


    【解决方案1】:

    您在这里看到了两个不同的问题。首先是derived&lt;B&gt;::type是一个依赖类型名,所以你必须使用typename关键字告诉编译器它是一个类型而不是一个对象:

    template<typename B>
    struct derived : base< typename derived<B>::type, B >
    {
      using type = int;
    }
    

    但在这种情况下这还不够,因为尚未定义 derived&lt;B&gt;,因此尚不存在 derived&lt;B&gt;::type

    对于简单的情况,您可以在两个地方硬编码类型:

    template<typename B>
    struct derived : base< int, B >
    {
      using type = int;
    }
    

    对于更复杂的情况,或者如果您想避免将来不小心将模板参数和 using 指令更改为不同,您可以将 type 提取到其他一些特征中,以便在 derived 之前可以访问它定义:

    template <typename B>
    struct my_trait
    {
        using type = int;
    };
    
    template <typename B>
    struct derived : base < typename my_trait<B>::type, B >
    {
        using type = typename my_trait<B>::type;
    };
    

    Live Demo

    【讨论】:

      【解决方案2】:

      为什么编译器检测不到类型?

      来自class#mem-6

      一个类被认为是一个完全定义的对象类型([basic.types]) (或完整类型)在类说明符的结束 } 处。

      因此,struct derived 的类型不完整,并且将 derived&lt;B&gt;::type 声明为模板参数是不正确的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多