gpt4 book ai didi

c++ - C++17 中的歧义错误(模板模板参数和默认参数问题)

转载 作者:IT老高 更新时间:2023-10-28 12:53:58 26 4
gpt4 key购买 nike

我的代码使用 c++14c++17 标准标志被 g++ 以不同方式解释:

#include <iostream>
#include <vector>

template<class T, class A>
void func(const std::vector<T, A>&v)
{
std::cout << 1 << std::endl;
}

template<typename T, template <typename>class Vector>
void func(const Vector<T>&v)
{
std::cout << 2 << std::endl;
}

void f()
{
std::vector<int> v;
func(v);
}

int main()
{
f();
return 0;
}

当我尝试使用命令编译此代码时

g++ -std=c++14 -Wall -pedantic main.cpp

一切正常。

但是当我试图用命令编译这段代码时

g++ -std=c++17 -Wall -pedantic main.cpp

我收到此错误:

main.cpp: In function 'void f()':
main.cpp:19:11: error: call of overloaded 'func(std::vector<int>&)' is ambiguous
func(v);
^
main.cpp:5:6: note: candidate: 'void func(const std::vector<_Tp, _Alloc>&) [with T = int; A = std::allocator<int>]'
void func(const std::vector<T, A>&v)
^~~~
main.cpp:11:6: note: candidate: 'void func(const Vector<T>&) [with T = int; Vector = std::vector]'
void func(const Vector<T>&v)

从 C++17 标准的角度来看,我无法弄清楚这段代码有什么问题。

最佳答案

自 C++17 以来行为发生了变化。

在 C++17 之前,代码可以工作,因为 std::vector 有两个模板参数(第二个有默认参数 std::allocator<T> ),而模板模板参数 Vector声明只有一个,它们不匹配然后第二个 func不予考虑。

自 C++17 ( CWG 150 ) 起,template template argument 允许使用默认模板参数将模板模板参数与更少的模板参数匹配。这意味着 func成为有效的候选人,然后导致歧义。

template<class T> class A { /* ... */ };
template<class T, class U = T> class B { /* ... */ };

template<template<class> class P> class X { /* ... */ };

X<A> xa; // OK
X<B> xb; // OK in C++17 after CWG 150
// Error earlier: not an exact match

关于c++ - C++17 中的歧义错误(模板模板参数和默认参数问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51893159/

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