gpt4 book ai didi

c++ - 向类中添加另一个参数会使代码无法编译

转载 作者:行者123 更新时间:2023-11-30 03:19:30 24 4
gpt4 key购买 nike

我创建了一个扩展处理程序映射集合的类,它根据自反参数执行一些任务(这是为 C++ 进行反射的尝试)。但是,当我将其参数化为不绑定(bind)到特定实现时,编译器拒绝工作,显示出奇怪的错误。长话短说,这个编译:

using namespace std;

template<class T>
class Blah {
public:
using ctx_t = map<T, string>;

private:
map<string, function<void(ctx_t&)>> handlers;

protected:
void registerHandler(const string& name, function<void(ctx_t&)> fn) {
handlers[name] = fn;
}
};

class BlahDescendant : public Blah<string> {
public:
BlahDescendant() {
registerHandler("ala", [](ctx_t& m) {cout << m["ala"]; });
}
};

int main() {
BlahDescendant desc;
return 0;
}

但是参数化的时候拒绝编译,说是

testfield.cpp:33:35: error: 'ctx_t' has not been declared

.

using namespace std;

template<class T, class X>
class Blah {
public:
using ctx_t = map<T, X>;

private:
map<string, function<void(ctx_t&)>> handlers;

protected:
void registerHandler(const string& name, function<void(ctx_t&)> fn) {
handlers[name] = fn;
}
};

template<class X>
class BlahDescendant : public Blah<string, X> {
public:
BlahDescendant() {
registerHandler("ala", [](ctx_t& m) {cout << m["ala"]; });
}
};

int main() {
BlahDescendant<string> desc;
return 0;
}

尝试在 lambda 中提供映射时会报告不同的错误:

error: 'registerHandler' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
registerHandler("ala", [](map<string,X>& m) {cout << m["ala"]; });

有人可以帮忙吗?

最佳答案

在类模板或类模板成员的定义中,如果类模板的基类依赖于模板参数,则在定义时的非限定名称查找期间不会检查基类范围类模板或成员的实例化或在类模板或成员的实例化期间。

所以你需要告诉编译器,你的类型 ctx_t 来自 Blah,所以你需要两者之一

[](typename Blah<string,X>::ctx_t& m) {cout << m["ala"]; }

template<class X>
class BlahDescendant : public Blah<string, X> {
public:
using ctx_t = typename Blah<string,X>::ctx_t;
};

registerHandler 也是非依赖名称,因此您需要明确使用 this 使其依赖于 BlahDescendant 和 Blah 作用域

template<class X>
class BlahDescendant : public Blah<string, X> {
public:
using ctx_t = typename Blah<string,X>::ctx_t;
BlahDescendant() {
this->registerHandler("ala", [](ctx_t& m) {cout << m["ala"]; });
}
};

关于c++ - 向类中添加另一个参数会使代码无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53633468/

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