【发布时间】:2019-05-17 17:15:50
【问题描述】:
以下代码
template<template<typename, typename> class T, typename EKeyType, typename EValueType>
class Baseclass
{
};
template<typename EKeyType, typename EValueType>
class Derived : public Baseclass<Derived, EKeyType, EValueType>
{
public:
void foo(const Baseclass<Derived, EKeyType, EValueType>& param){}
};
导致以下编译错误:
MSVC 14: error C3200: 'Derived<EKeyType,EValueType>': invalid template argument for template parameter 'T', expected a class template
clang 3.0.0: error: template argument for template template parameter must be a class template.
但是Derived是类模板。
当我将代码更改为以下代码时,一切编译正常:
template<template<typename, typename> class T, typename EKeyType, typename EValueType>
class Baseclass
{
};
template<typename EKeyType, typename EValueType> class Derived;
template<typename EKeyType, typename EValueType>
class Derived2 : public Baseclass<Derived, EKeyType, EValueType>
{
public:
void foo(const Baseclass<Derived, EKeyType, EValueType>& param){}
};
这表明错误信息具有误导性。
第一个代码有什么问题?
我怎样才能让模板子类继承自模板基类,子类是基类的模板模板参数,并且子类中还有一个成员函数,它以对该基类的引用作为参数?
【问题讨论】:
-
您使用的是哪个版本的 clang 以及哪些标志?我无法重现此问题:godbolt.org/z/fl9aES
-
@MichaelKenzel:我刚刚检查了各种版本的clang,我可以在godbolt上用5.0.0之前的clang版本重现它,但我不能用5.0.0和更新的版本重现它铿锵声。
-
@MichaelKenzel 在复制代码中包含 foo 函数对于复制至关重要。您的链接中缺少它。
-
啊,确实,对不起,我的错误。无论如何,您现在已经在下面得到了答案……
标签: c++ c++03 template-templates