C - 无法推断模板参数

C++ - Could not deduce template argument

本文关键字:参数      更新时间:2023-10-16

我有一个示例代码,该代码使用模板编程,在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)=> sistion_array&lt; 0> :: run(riveved_builtin&amp;,const u [n]))':无法推论'const u [n]的模板参数'来自'const int *'

,我已经注意到错误消息中有一些奇怪的东西可以改进_builtin。在agiss_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在评论中提到的解决方案。但是选择了塔塔拉玛的解决方案,因为修改更容易:

"更改改进的_builtin并通过参考来进行数组可能有效:const t(&amp; v)[n]和const u(&amp; b)[n]"

这是因为传递参考可以帮助我们保留数组大小。但是我仍然不知道为什么它可以使用G 进行编译和运行。