【问题标题】:Issue with template template parameter in function template函数模板中的模板模板参数问题
【发布时间】:2020-11-08 23:30:02
【问题描述】:

我正在尝试使用模板模板参数,但我的代码无法编译。

template<class DataType, template<class T> class Container>
void foo(Container<DataType> test)
{
    
}

int main()
{
    std::vector<int> testVec{1,2,3,4};
    
    foo<int, std::vector>(testVec);
}

错误信息是 "调用 'foo' 没有匹配的函数。

  1. 候选模板被忽略:模板参数“容器”的显式指定参数无效”

谁能帮帮我?

【问题讨论】:

  • 请在问题中包含完整的错误消息。我的编译器告诉我出了什么问题godbolt.org/z/96a3Eq。如果您不理解错误消息,其他人会,无论如何,错误消息是您应该用来修复错误的内容
  • @idclev463035818 添加错误消息是必须的,但公平地说,GCC 在这里用经典的note: template argument deduction/substitution failed 毫无帮助。
  • 我已经添加了错误信息。谢谢两位
  • @HolyBlackCat 推荐的候选人通常对我有很大帮助。出于某些原因,提问者经常会跳过所有附加信息并专注于“它不起作用”的消息版本

标签: c++ templates


【解决方案1】:

建议:试试

// ...............................VVVVVVVVV
template<class DataType, template<class ...> class Container>
void foo(Container<DataType> test)
{
    
}

问题在于std::vector接受两个类型的模板参数;第二个有默认值。

如果你写

// ...............................VVVVVVV
template<class DataType, template<class T> class Container>

您要求接受单一类型模板参数的模板模板参数。

这样就可以解决问两个类型模板参数

// ...............................VVVVVVVVVVVV
template<class DataType, template<class, class> class Container>

或者,为了更灵活,类型模板参数的可变参数列表

// ...............................VVVVVVVVV
template<class DataType, template<class ...> class Container>

正如 HolyBlackCat 所指出的(感谢),您的代码(因此要求单个类型模板参数的模板模板参数)应该在 C++17 之前失败,但应该从 C++17 开始被接受(匹配规则已更改)。

不幸的是,这适用于 g++,但不适用于 clang++:默认情况下,clang++ 开发人员没有实现这个新的 C++17 匹配规则。

但 HolyBlackCat 报告说,clang++ 也接受您的代码添加一个特殊参数:-frelaxed-template-template-args

【讨论】:

  • 或者OP可以添加-std=c++17,那么代码应该可以正常工作。
  • @HolyBlackCat - 你确定吗?我的意思是......我知道 C++17 改变了一些关于模板-模板匹配的东西(不幸的是,我不记得到底是什么)但我看到 g++(编译 C++17)接受 clang++(也是最新版本,也编译 C++20) 给出错误。
  • IIIRC Clang 开发人员拒绝实施此更改,因为他们认为新措辞有缺陷,因为它无缘无故破坏了一些旧代码。如果你通过-frelaxed-template-template-args,Clang 接受它。
  • 有趣的是,这不需要 std::vector 成为可变参数模板。现在我想知道是否可以有一个只匹配可变参数模板的模板模板参数
  • @max66 我想我要问一个问题,只是需要一些时间准备一个好案例
猜你喜欢
  • 2010-12-08
  • 1970-01-01
  • 2013-08-02
  • 2011-05-27
  • 2012-11-05
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多