gpt4 book ai didi

c++ - 编译器选择专门用于数组的预期模板,但随后尝试将数组参数转换为指针

转载 作者:行者123 更新时间:2023-11-28 06:54:14 25 4
gpt4 key购买 nike

以下代码无法编译,主要是以下错误:

variadic_function2.cpp:68:17: note:   template argument deduction/substitution failed:
variadic_function2.cpp:86:53: note: cannot convert ‘params#0’ (type ‘const char [64]’) to type ‘char*’

第 68 行是 Helper<T[N]>::CopyFrom特化,因此编译器 (g++ 4.8.1) 正在选择正确的模板。神秘地(对我来说),它然后尝试转换 char[64]char * .

如果第 68 行从

static bool CopyFrom (F f, T arr[N])

static bool CopyFrom (F f, const T arr[N])

然后编译正常。

有人可以帮我了解发生了什么吗?


#include <vector>
#include <functional>
#include <cstddef>

template <typename T, typename... Params>
struct Helper
{
static size_t Sizeof()
{
return sizeof (T) + Helper<Params...>::Sizeof();
}

template <typename F>
static bool CopyFrom (F f, T t, Params... params)
{
if (!f (reinterpret_cast<const char*>(&t), sizeof(t)))
return false;

return Helper<Params...>::CopyFrom (f, params...);
}
};


template <typename T>
struct Helper<T>
{
static size_t Sizeof()
{
return sizeof (T);
}

template <typename F>
static bool CopyFrom (F f, T t)
{
return f (reinterpret_cast<const char*>(&t), sizeof(T));
}
};


template <typename T, size_t N, typename... Params>
struct Helper<T[N], Params...>
{
static size_t Sizeof()
{
return N * sizeof (T) + Helper<Params...>::Sizeof();
}

template <typename F>
static bool CopyFrom (F f, T arr[N], Params... params)
{
// if (!f (reinterpret_cast<const char*>(arr), sizeof(arr)))
// return false;

return Helper<Params...>::CopyFrom (f, params...);
}
};


template <typename T, size_t N>
struct Helper<T[N]>
{
static size_t Sizeof()
{
return N * sizeof (T);
}

template <typename F>
static bool CopyFrom (F f, T arr[N])
{
return f (reinterpret_cast<const char*>(arr), sizeof(arr));
}
};


template <typename... Params>
size_t GetSizeof (const Params&... params)
{
return Helper<Params...>::Sizeof();
}


template <typename F, typename... Params>
bool CopyFrom (F f, const Params&... params)
{
return Helper<Params...>::CopyFrom (f, params...);
}


struct UnitTestFixture
{
bool Read (const char* buf, size_t bufLen)
{
m_calltrace.push_back (bufLen);
return true;
}

void Reset()
{
m_calltrace.clear();
}

std::vector<size_t> m_calltrace;
};


int main()
{
UnitTestFixture utf;
char buf[64];
CopyFrom (std::bind(&UnitTestFixture::Read, &utf, std::placeholders::_1, std::placeholders::_2), buf);
}

最佳答案

template <typename F, typename... Params>
bool CopyFrom (F f, const Params&... params)
{
return Helper<Params...>::CopyFrom (f, params...);
}

当你传递一个 char[64] 时,params... 将是一个 const char (&) [64],它会衰减为 const char*,它不能传递给需要 char* 的函数。删除 const 并编译(至少使用 gcc)。

此外,sizeof(arr) 不会执行您期望的操作(它将返回 sizeof char*,而不是 sizeof char[64] )。这很容易通过使用 sizeof T[N] 来解决。

关于c++ - 编译器选择专门用于数组的预期模板,但随后尝试将数组参数转换为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23376590/

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