【发布时间】:2020-11-02 23:40:02
【问题描述】:
我已经对此感到困惑了一段时间,并提炼了一个简单的错误消息示例。有什么方法可以使这项工作吗?我只是在某处缺少“模板”或“类型名”吗?
#include <cstdint>
template<typename T, typename J>
struct silly
{
const void (*f)(T,J);
};
template<typename T, typename J, silly<T, J> aSilly>
struct sillier
{
const uint32_t something;
};
void dumb_func(uint32_t i, uint32_t j)
{
return;
}
constexpr silly<uint32_t, uint32_t> mySilly{ .f = dumb_func };
using silliest = sillier<uint32_t, uint32_t, mySilly>;
int main()
{
return 2;
}
g++ 吐出:
g++ -std=c++2a ugh.cpp
ugh.cpp:20:51: error: invalid conversion from ‘void (*)(uint32_t, uint32_t)’ {aka ‘void (*)(unsigned int, unsigned int)’} to ‘const void (*)(unsigned int, unsigned int)’ [-fpermissive]
20 | constexpr silly<uint32_t, uint32_t> mySilly{ .f = dumb_func };
| ^~~~~~~~~
| |
| void (*)(uint32_t, uint32_t) {aka void (*)(unsigned int, unsigned int)}
ugh.cpp:20:51: error: ‘dumb_func’ is not a valid template argument of type ‘const void (*)(unsigned int, unsigned int)’ because ‘dumb_func’ is not a variable
我已尝试通读https://en.cppreference.com/w/cpp/language/template_parameters,但我在这里超出了我的模板深度。实际用例 T 和 J 类似于 std::array
【问题讨论】:
-
这与
silly是模板无关。 -
有趣。但是由于删除最后一行解决了问题,它确实与它是一个非类型模板参数有关。
-
cdecl: explain const void (*f)(T,J); => declare f as pointer to function (T, J) returning const void ... explain void (* const f)(T,J); => declare f as const pointer to function (T, J) returning void-- const 应该在里面吗? -
是的,请参阅下面的 cmets。谢谢