gpt4 book ai didi

c++ - 无法推断模板类成员的类型

转载 作者:行者123 更新时间:2023-12-02 10:07:11 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Class Template Argument Deduction in member variables

(1 个回答)


2年前关闭。




受到 This 的启发例如,即通过这段特定的代码

// ...
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
// ...
std::visit(overloaded {
[](auto arg) { std::cout << arg << ' '; },
[](double arg) { std::cout << std::fixed << arg << ' '; },
[](const std::string& arg) { std::cout << std::quoted(arg) << ' '; },
}, v);

...我试图定义类型为 overloaded 的类成员,但偶然发现困难,我认为(但不完全确定)是由于编译器无法推断模板的参数造成的。
template<class ...Ts>
struct overloaded : Ts... {
using Ts::operator()...;
constexpr overloaded(Ts... ts) : Ts(ts)... {}
};

struct as{};

class phil_t {
int i;
overloaded o { [&](as&) {cout << i << "as"; } }; // <-- HERE
};

这就是我收到的输出:
../../variant.hpp:21:5: error: invalid use of template-name ‘overloaded’ without an argument list
overloaded o { [&](as&) {cout << i << "as"; } };
^~~~~~~~~~

很明显,当我使用相同的方法来实例化不在类中的对象时,一切都很顺利。
void varnt() {
int i = 42;
auto o = overloaded( [&](as&) {cout << i << "as"; } );
}

任何解决方法的建议、解释或提示将不胜感激。

谢谢你。

最佳答案

你不能有一个不是你在 phil_t 中尝试做的特定类型的成员变量。 ,如 overloaded指的是模板而不是类型。

class phil_t;

auto make_overloaded(phil_t& pt) {
return overloaded { [&](auto & x) { /* do something with x */ } };
}

class phil_t {
int i;
decltype(make_overloaded(std::declval<phil_t&>())) o = make_overloaded(*this); // <-- HERE
};

实例 here .

这段代码的问题是你想使用 phil_t在你的 lambda 中,所以你不能使用我的方法,因为 phil_t make_overload 时不完整叫做。

感谢@Evg:这是一个使用类型删除的解决方案,它比上面的代码效果更好:
#include <iostream>
#include <any>

template<class ...Ts>
struct overloaded : Ts... {
using Ts::operator()...;
constexpr overloaded(Ts... ts) : Ts(ts)... {}
};

struct as1 {};
struct as2 {};

class phil_t {
private:
auto make_overloaded() {
return overloaded{
[&](as1& x) { std::cout << "1: " << i << std::endl; },
[&](as2& x) { std::cout << "2: " << i << std::endl; }
};
}

public:
phil_t() : o(make_overloaded()) {}

template<class As>
void foo(As as) {
std::any_cast<decltype(make_overloaded())>(o)(as);
}

private:
int i = 42;
std::any o;
};

int main() {
phil_t p;
p.foo(as1{});
p.foo(as2{});
}

第二个片段的所有学分都归@Evg!

实例 here .

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

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