c ++模板 - 类型/值不匹配 - 使用依赖于派生类的类型实例化基类模板

时间:2018-04-11 00:51:19

标签: c++ templates inheritance

以下代码无法使用类型/值不匹配错误进行编译,但我知道正在提供类型。我错过了什么?

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<B>::type不是有效类型?

此外尝试了以下内容:

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

并收到以下错误:

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

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

2 个答案:

答案 0 :(得分:2)

  

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

来自class#mem-6

  

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

因此,struct derived的类型不完整,声明derived<B>::type作为模板参数的格式不正确。

答案 1 :(得分:2)

您在这里看到了两个不同的问题。第一个是((MainActivity) getActivity()).setProductList(itemSaleProductList); 是一个依赖类型名称,所以你必须使用derived<B>::type关键字来通知编译器它是一个类型而不是一个对象:

typename

在这种情况下,这还不够,因为template<typename B> struct derived : base< typename derived<B>::type, B > { using type = int; } 尚未定义,所以derived<B>尚不存在。

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

derived<B>::type

对于更复杂的情况,或者如果您想避免在将来意外更改模板参数和使用指令时,您可以将template<typename B> struct derived : base< int, B > { using type = int; } 拉出到其他特性中,以便它可以在type定义之前可访问:

derived

Live Demo