gpt4 book ai didi

c++ - 无法推断模板参数

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:46 24 4
gpt4 key购买 nike

我正在尝试使用类似于以下的 API:

#include<iostream>
#include<boost/optional.hpp>

class Base
{
int id;
public:
int get_id()
{
return id;
}
};

class A : public Base
{
};

class B : public Base
{
};

class M
{
public:
enum Type
{
t_A,
t_B
};
Type type;
boost::optional<A&> a;
boost::optional<B&> b;
boost::optional<A&> get_A()
{
return a;
}

boost::optional<B&> get_B()
{
return b;
}

};

我需要通过任何派生类到达基础。所以我创建了一个这样的模板化函数:

template<class T>
boost::optional<T&> get(M & m)
{
switch(m.type)
{
case M::t_A :
return m.get_A();
case M::t_B :
return m.get_B();
default:
throw;
};
}

int main()
{
M m;
//... initialization of m
int i = get<>(m)->get_id();
return 0;
}

但是无法推导我函数的模板参数:

template_sp_1.cpp:63:17: error: no matching function for call to ‘get(M&)’
int i = get<>(m)->get_id();
^
template_sp_1.cpp:63:17: note: candidate is:
template_sp_1.cpp:46:21: note: template<class T> boost::optional<T&> get(M&)
boost::optional<T&> get(M & m)
^
template_sp_1.cpp:46:21: note: template argument deduction/substitution failed:
template_sp_1.cpp:63:17: note: couldn't deduce template parameter ‘T’
int i = get<>(m)->get_id();

尝试以下任何一种方法都是不可能的;显然是由于使用 boost::optional :

int i = get<Base>(m)->get_id();
int i = get<A>(m)->get_id();
int i = get<B>(m)->get_id();

您有针对此类情况的解决方案吗? (我无法触摸 API)

最佳答案

编译器错误非常明显:由于 T 不依赖于任何函数参数,并且您没有显式传递该 T,因此编译器无法推断出 T 的值。

请注意,那些 a 和 b 可选值具有不同的类型,因此您的 get() 函数试图返回多种不同的类型(因此您尝试使用模板化可选值?)

C++ 不以这种方式工作,因为类型应该在编译时确定,而您的决定取决于运行时值(开关事物)。考虑返回一个变体类型,如 boost::variant。

关于c++ - 无法推断模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30726303/

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