royqh1979 / RedPanda-CPP

A light-weight C/C++ IDE based on Qt
GNU General Public License v3.0
938 stars 102 forks source link

编辑器无法推断出对非容器类的迭代器使用 解引用运算符"*" 或 箭头访问运算符"->" 产生的类型 #410

Closed West-Pavilion closed 4 months ago

West-Pavilion commented 4 months ago

编辑器无法推断出对非容器类的迭代器使用 解引用运算符"*" 或 箭头访问运算符"->" 产生的类型

例如,请考虑如下的 C++ 代码:

#include <filesystem>
#include <iostream>

/* 编辑器无法推断出对非容器类的迭代器使用 解引用运算符"*" 或 箭头访问运算符"->" 产生的类型 */

int main() {
    std::filesystem::path path(".");
    std::filesystem::directory_iterator iter(path);
    /* directory_iterator 对运算符 "->" 和 "." 的声明如下:
     * const std::filesystem::directory_entry& operator*() const;
     * const std::filesystem::directory_entry* operator->() const; */

    /* 使用 "*" 访问该迭代器指向的对象时,有补全提示,但不正确 */
//  (*iter).
    /* 使用 "->" 访问该迭代器指向的对象时,没有补全提示 */
//  iter->
    std::system("chcp 65001");
    /* 使用基于范围的 for 循环输出当前目录下的所有文件名 */
    for (auto i : iter) {
        /* 这里的 i 没有补全提示,因为编辑器暂时还不支持对非容器类的迭代器的访问 */
//      i.
        if (!i.is_directory()) {
            std::cout << i << std::endl;
        }
    }
}

如下图所示,由于 (*iter) 的返回类型是 const std::filesystem::directory_entry&,所以编辑器给出的补全提示是不正确的 屏幕截图(384)

如下图所示,使用箭头运算符 "->" 访问 iter 时,编辑器不会显示其对应的补全提示 屏幕截图(385)

如下图所示,在基于范围的 for 循环中,对 auto 类型的范围变量,编辑器无法推断出其具体类型 屏幕截图(386)

下面是对应的测试代码:

编辑器无法推断出对非容器类的迭代器使用 解引用运算符 或 箭头访问运算符 产生的类型.zip

royqh1979 commented 4 months ago

一直都不支持模板类型推断。

West-Pavilion commented 4 months ago

一直都不支持模板类型推断。

对下面这两种情况的类型推断,小熊猫C++不仅支持,而且十分精准且强大

屏幕截图(389)

屏幕截图(390)

图中使用的测试代码:

小熊猫C++支持对容器类的迭代器的类型推导.zip

royqh1979 commented 4 months ago

很简单,你把标准库头文件里所有的std都替换成随便一个什么东西,然后再试试

West-Pavilion commented 4 months ago

很简单,你把标准库头文件里所有的std都替换成随便一个什么东西,然后再试试

好有意思,把 std 换成另一个名字后,前面说的类型推断就不会生效了

West-Pavilion commented 4 months ago

此 issue 暂时关闭,等到时机成熟再次开启