C++基类typedef函数指针在main中不可见的问题求助
解决类作用域内typedef的函数指针在main中可见的问题
嘿,这个问题其实是C++的作用域规则在搞事情~你定义的NamePointer是嵌套在基类A的作用域里的,全局作用域下直接写NamePointer编译器根本找不到它,得明确指定它的类作用域才行。下面给你几种可行的解决方案:
方案1:直接通过基类A的作用域访问
因为NamePointer是在基类A中公开声明的,所以在main里直接用A::NamePointer就能访问到它,不需要借助子类B:
int main() { A::NamePointer pointer; pointer = function; // 这里假设function是符合std::function<void(argument)>签名的函数 return 0; }
方案2:通过子类B的作用域访问
你在子类B里写了using typename A::NamePointer;,这相当于把基类的NamePointer引入到了B的作用域中,所以也可以用B::NamePointer来访问:
int main() { B::NamePointer pointer; pointer = function; return 0; }
方案3:(不推荐)将类型引入全局作用域
如果实在想在main里直接写NamePointer,可以在全局作用域里用using声明把它拉出来,但这样会污染全局命名空间,不建议在大型项目中使用:
// 在类定义之后、main之前添加 using NamePointer = A::NamePointer; int main() { NamePointer pointer; pointer = function; return 0; }
另外你提到尝试过Vector::NamePointer,应该是笔误啦——这里和Vector没啥关系,得用A::或者B::来指定作用域才行~
给你一个完整的可运行示例代码参考:
#include <functional> #include <iostream> // 先定义argument类型,假设是int using argument = int; class A { public: typedef std::function<void(argument)> NamePointer; }; class B : public A { using typename A::NamePointer; // 这行是可选的,因为继承自A的公开成员本来就可以通过B::访问 }; // 示例函数,符合签名 void testFunc(int arg) { std::cout << "Received argument: " << arg << std::endl; } int main() { // 用A::NamePointer A::NamePointer ptr1 = testFunc; ptr1(123); // 用B::NamePointer B::NamePointer ptr2 = testFunc; ptr2(456); return 0; }
内容的提问来源于stack exchange,提问作者Wozy Wors
相关产品推荐
相关产品推荐

