gpt4 book ai didi

C++ - 无法推导出模板参数

转载 作者:行者123 更新时间:2023-12-04 14:48:59 24 4
gpt4 key购买 nike

我有一个使用模板编程的示例代码,它在 linux 上运行良好。但是当我尝试将它带到带有 Visual Studio 12 的 Windows 时,我遇到了关于模板参数推导的编译错误。这是导致错误的代码部分:

template <int I>
class assign_array
{
public:
template <typename U, unsigned N>
static inline void run(improved_builtin<U, N>& a, const U b[N])
{
// do sth
}
};

template <template <int> class A, int I, int E>
struct loop_iter
{
template <typename U, typename V>
static inline void iter(U& a, V& b)
{
A<I>::run(a, b); // get error here
}
};

template <typename T, unsigned N>
improved_builtin<T, N>::improved_builtin(const T v[N])
{
loop_iter<assign_array, 0, N - 1>::iter(*this, v);
return;
}

错误发生在 A::run(a, b) =>assign_array<0>::run(improved_builtin &,const U [N])' :无法从 'const 推导出'const U [N]'的模板参数整数 *'

而且我注意到在改进_builtin 的错误消息中有一些奇怪的东西。在assign_array类中,第一个参数的签名应该是improved_builtin。我不知道为什么美国会出现在那里。有人对这个错误有任何想法吗?

最佳答案

当您将数组传递给函数时,它会衰减为指针,因此您将失去试图从中推断出模板参数的大小。通过引用传递数组将保留类型并允许进行推导:

static inline void run(improved_builtin<U, N>& a, const U (&b)[N])
// take by reference ^

g++(和clang)无论如何都能编译你的例子的原因是他们使用你的 improved_builtin推断 U 类型的参数和 N 的值而不是数组类型。出于某种原因,VS2012 没有这样做,而是尝试从数组中进行推断,这是无效的,因为它已经衰减了。如果你没有那个 improved_builtin论点,您的示例根本无法编译。

关于C++ - 无法推导出模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30185582/

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