这是一个完全可重现的问题 PoC,发布在 Compiler Explorer 上:https://godbolt.org/z/x78Ksro88。
我遇到以下问题:编译器报告错误,因为在
search_in
表示模板类型的情况下,它无法将参数 2(在 T
函数中)从类型 T
转换为实际类型。
template <typename T>
void analyze(vegtable& type, const std::vector<std::uint8_t>& dee, T& pee, int ole, std::uint16_t cee)
{
switch (type)
{
case type::banana:
beta::search_in(dee, pee, ole, cee);
break;
case type::orange:
gemma::search_in(dee, pee, ole, cee);
break;
case type::lemon:
zeta::search_in(dee, pee, ole, cee);
break;
default:
break;
}
}
vegetable
是类型为 std::uint8_t
的类型化类枚举。
我按如下方式调用分析函数(
sample
的类型为potato
):
analyze<potato>(organic, data, sample, 12);
其中一些类型定义如下,例如:
vegetable organic;
organic = vegetable::banana;
struct potato
{
int x;
int y;
int z;
};
potato sample;
如果我删除 switch case
type::orange:
和 type::lemon:
的函数调用,代码将按预期编译并工作,但如果我保留如图所示的分析函数,编译器会抛出本问题序言中所述的错误。这是一种奇怪的行为!
注意:除了
T
类型之外,我还使用 potato
参数传递其他类型,如 PoC 中所示。
我可以保证在调用
analyze
函数时,通过 T
函数调用传递给每个案例的 search_in
类型是正确的类型。看来编译器也想不通啊!
由于除了
search_in
参数之外,所有的 pee
函数都是相同的,因此甚至没有理由使用 switch case 语句,相反,您可以只依靠重载解析来为您调用正确的函数:
template <typename T>
void analyze(vegetable& place, const std::vector<std::uint8_t>& dee, T& pee, int ole, std::uint16_t cee)
{
using beta::search_in;
using gemma::search_in;
using zeta::search_in;
search_in(dee, pee, ole, cee);
}