繁体   English   中英

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

[英]C++ - Could not deduce template argument

我有一个使用模板编程的示例代码,它在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]'的模板参数int *'

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

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

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参数,那么您的示例将根本无法编译。

正如TartanLlama和Johny在评论中提到的那样。 但是选择TartanLlama的解决方案是因为它更容易修改:

“更改changed_builtin并运行以通过引用获取数组可能会起作用:const T(&v)[N]和const U(&b)[N]”

这是因为通过引用传递有助于我们保留数组大小。 但是我仍然不知道为什么它可以使用g ++进行编译和运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM