You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:12:38