c++ - 子类作为模板基类的模板模板参数,它又是子类函数参数
问题描述
以下代码
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){}
};
这表明错误消息具有误导性。
第一个代码有什么问题?
如何让模板子类继承自模板基类,子类是基类的模板模板参数,并且子类中还有一个成员函数,该函数将对该基类的引用作为参数?
解决方案
第一个片段被 GCC 和 Clang 接受。见这里。
我似乎记得 MSVC 有一个错误,它认为Derived
引用注入的类名,而不是模板名。但是,标准非常清楚,当封闭类的名称用作模板模板参数的参数时,它应该被解释为模板([temp.local]/1),因此您的代码很好。
看来您使用的旧版本的 Clang 可能有相同的错误。
作为一种解决方法,您可以编写::Derived
强制它查找模板名称,而不是注入的类名称。
推荐阅读
- django - django.core.exceptions.AppRegistryNotReady:加载 wsgi.py 时尚未加载应用程序
- docker - docker:已安装卷的权限错误
- c# - 在漫游时随机移动 Picturebox
- java - Python:使用 JayDeBeApi 的 JDBC 连接错误
- javascript - 正则表达式用 JavaScript 中的条件拆分逗号上的字符串
- firebase-cloud-messaging - Firebase 云消息传递:未使用智能手机的行为
- java - JPA 无法在多对一关系中持久化实体
- python - Django inlineformset_factory 和 ManyToManyField 字段,再一次
- user-interface - 更改 VS Code 上的默认新编辑器组位置
- office-js - Outlook Online - 对话框问题