gpt4 book ai didi

c++ - 模板模板参数与推导的模板参数不一致

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:03 29 4
gpt4 key购买 nike

以下代码编译失败并出现错误 template template argument has different template parameters than its corresponding template template parameter :

#include <tuple>
#include <vector>
#include <string>
#include <iostream>

template<template<typename, typename> class Blah, typename KeyType, typename ValueType>
void print_tuploid(const Blah<KeyType, ValueType>& tup) {
std::cout << "first value: " << std::get<0>(tup) << " second value: " << std::get<1>(tup) << std::endl;
}

int main() {
auto stuff = std::make_tuple(1, 2);
print_tuploid(stuff);
}

这段代码背后的初衷无关紧要,此时我只是想了解为什么这被认为是无效的。

如果我将调用更改为 std::make_tuple进入std::make_pair ,代码编译和运行正确,这让我相信有一些奇怪的事情是特定于 std::tuple 的.

我原本以为std::tuple可能有一些我不知道的额外的默认模板参数,因为如果我更改 print_tuploid 的定义对于以下内容,代码确实为 std::make_tuple 编译和 std::make_pair :

template<template<typename...> class Blah, typename KeyType, typename ValueType>
void print_tuploid(const Blah<KeyType, ValueType>& tup) {
std::cout << "first value: " << std::get<0>(tup) << " second value: " << std::get<1>(tup) << std::endl;
}

但是当我试图导出 stuff 的推导类型时使用以下代码:

#include <tuple>

template<typename T>
class TypePrinter;

int main() {
auto stuff = std::make_tuple(1, 2);
TypePrinter<decltype(stuff)> error;
}

报告:implicit instantiation of undefined template 'TypePrinter<std::__1::tuple<int, int> >' ,让我相信事实并非如此。

此外,作为附带问题,为什么在这种情况下不会发生引用折叠?以下代码也被认为是无效的:

#include <iostream>

template<template<typename, typename> class Blah, typename KeyType, typename ValueType>
void print_tuploid(Blah<KeyType, ValueType>&& tup) {
std::cout << "first value: " << std::get<0>(tup) << " second value: " << std::get<1>(tup) << std::endl;
}

int main() {
auto stuff = std::make_pair(1, 2);
print_tuploid(stuff);
}

给出错误:no known conversion from 'std::__1::pair<int, int>' to 'pair<int, int> &&' for 1st argument .

基本上,我只是想通过了解这里到底发生了什么来扩展我的模板知识。很抱歉发了这么长的帖子,并提前感谢任何人能够提供的任何指导。

最佳答案

该函数的问题在于它与恰好采用 2 个参数的模板类匹配。实际上,std::tuple具有 template <typename...> 的模板签名.区别在于 tuple接受任意数量的模板参数,而您的函数需要 2 个。

std::pair工作正常,因为模板签名是 template <typename, typename>完全匹配。

虽然我找不到最新版本,但有一个提案可以实现这种特化。它似乎已经传递到 C++17,或者至少是类似的东西,因为模板模板参数的 cppreference 页面认为这是一个有效的例子。我找到的提案是here .

你的第二个版本不接受的原因std::pair是因为它需要一个右值引用。一旦拥有(部分)专用类型,就无法处理 &&作为转发引用。

关于c++ - 模板模板参数与推导的模板参数不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45725787/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com