以下代码无法使用类型/值不匹配错误进行编译,但我知道正在提供类型。我错过了什么?
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>'
为什么编译器无法检测到类型?
答案 0 :(得分:2)
为什么编译器无法检测到类型?
一个类被认为是一个完全定义的对象类型([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