C++20 非类型模板参数是先前类型参数 : is not a valid template arg, 中的模板,因为它不是变量

标签 c++ templates c++20

我已经被这个问题困扰了一段时间,并提炼出一个简单的错误消息示例。有什么方法可以使这项工作吗?我只是在某处缺少"template"或"typename"吗?

#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 然后 sillier> 继承自其他一些更通用的类,并覆盖了哪个调用f 之类的函数,以便所有内容都内联到给定 silly 实例的专用函数中。

最佳答案

编辑:

sillier的第三个模板参数是非类型模板参数,只能绑定(bind)变量,而dumb_func不是变量。

这个解释没有意义,事实上代码可能没问题,错误可能只是一个bug如本 answer 中发现和报道的那样.不过,下面给出的修复仍然有效。


您可以将第三个模板参数设置为引用类型的非类型模板参数。

template<typename T, typename J, silly<T, J> const & aSilly>
                                          // ^^^^^^^
struct sillier
{
    const uint32_t something;
};

另外,silly 中的成员变量f 被声明为返回const void 类型的函数指针:

const void (*f)(T,J);

因此,您要么需要从 f 的返回类型中删除 const,要么可以更改 dumb_func 的声明以返回一个const void 类型:

const void dumb_func(uint32_t i, uint32_t j)
{
    return;
}

const void 返回函数似乎没有任何意义,所以我会选择第一个选项。


这是一个 demo .

关于C++20 非类型模板参数是先前类型参数 : is not a valid template arg, 中的模板,因为它不是变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64654827/

相关文章:

c++ - 变形还是封装,这就是问题! (C++)

c++ - 包含格式错误的模板成员函数的格式正确的程序?

c++ - 用于模板实例化的 Clang/g++ 选项

c++ - 为什么计算 future 方向上从工作日 y 到工作日 x 的一天距离必须如此复杂?

c++ - 如果 std::vector::insert(pos, value) 的位置无效怎么办?

c++ - 为什么 `std::remove_cv<_Iter>::type` 不是一个类型?

c++ - 传递值作为引用和 "const"值

c++ - 输入错误: split part of one entery

c++ - 如何将数组数组传递给函数?

c++ - 如何从双参数模板创建单参数模板以用作基类模板模板参数