无法将模板参数转换为传递的实际类型

问题描述 投票:0回答:1

这是一个完全可重现的问题 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
类型是正确的类型。看来编译器也想不通啊!

c++ templates
1个回答
0
投票

由于除了

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.