C++ C++;IDE不会推断/自动完成对模板类中std::数组下标表达式的成员访问 A类{ B类{ 公众: int gwe=0; }; 阵列arr; 公众: (){ arr[0].gwe;//开始键入“g”时,IDE将建议自动完成“gwe” } };

C++ C++;IDE不会推断/自动完成对模板类中std::数组下标表达式的成员访问 A类{ B类{ 公众: int gwe=0; }; 阵列arr; 公众: (){ arr[0].gwe;//开始键入“g”时,IDE将建议自动完成“gwe” } };,c++,xcode,generics,ide,clion,C++,Xcode,Generics,Ide,Clion,现在,如果你在上面加上:模板 当试图访问数组元素的成员时,IDE将不会自动完成。 让它成为Xcode,CLion,我没有尝试过VS,但我相信它也会复制这种行为。 在将泛型与其他语言(如C#、Java或Swift)一起使用之前,我从未经历过这种情况。 那么为什么C++必须如此呢?< < P > >解析C++是一个极其复杂和耗时的问题。 如果IDE能够完美地完成这项工作,它将花费与编译应用程序同样多的时间,并且您会因为IDE没有响应而感到恼火 因此,为了响应,IDE在有限的时间内进行有限的解析,这意

现在,如果你在上面加上:
模板

当试图访问数组元素的成员时,IDE将不会自动完成。
让它成为Xcode,CLion,我没有尝试过VS,但我相信它也会复制这种行为。
在将泛型与其他语言(如C#、Java或Swift)一起使用之前,我从未经历过这种情况。

那么为什么C++必须如此呢?< < P > >解析C++是一个极其复杂和耗时的问题。 如果IDE能够完美地完成这项工作,它将花费与编译应用程序同样多的时间,并且您会因为IDE没有响应而感到恼火

因此,为了响应,IDE在有限的时间内进行有限的解析,这意味着它们并不总是正确的


“自动完成”和类似的功能可以提供帮助,但它们并不是最终的事实——不要指望它们会是这样。

不知道这个特定的上下文。然而,根据我与其他IDE的经验,我可以想到一种可能性。请检查IDE版本是否支持C++ 11特性的自动完成,如STD::数组是C++ 11的工作特性。
检查是否需要安装其他插件以启用c++11功能的自动完成

“这将花费与编译应用程序一样多的时间”-这是错误的。您不需要IDE发出对象代码来获得适当的自动完成支持。您也不需要IDE来运行优化器来获得适当的自动完成支持。autocomplete失败的最常见原因是,autocomplete使用的编译器前端与用于生成二进制工件的编译器前端不同。由于C++是复杂的,编译器前端很少会达成一致。这不是因为太贵。@IInspectable“这不是因为太贵”——我尊重地不同意。我很清楚IDE使用不同于编译器的解析器,但我也知道他们想要有响应性,并且他们的解析时间有一个上限(为了保持响应性)…IDE已经设计了策略,这样您就不必在键入时支付解析的费用。更重要的是,问题中描述的场景与那些假定的错误无关。IDE准确地识别了一个,并停止提供支持,因为它无法提供任何支持。这就是类(和函数)模板的本质。当您将
template
放在类定义前面时,您已将其转换为类模板。类模板与泛型非常不同,因为类模板不会生成任何代码。这是一个蓝图,编译器无法推断任何关于类模板的内容,除非您实例化它。Visual Studio似乎是唯一支持的IDE,使其能够将自动完成功能引入类模板中。@I不可检测,很抱歉让您失望,但我在问题中给出的示例同样适用于Visual Studio for Windows。如果你不相信的话,请自己试试。我刚刚试用了VisualStudio201916.4.0,模板IntelliSense就像广告中宣传的那样工作。如果只是将类定义转换为类模板,IntelliSense将停止提供建议。但是,如果为模板类型参数选择一个类型,IntelliSense将再次开始工作。我为
T
任意选择了
int
,然后键入
arr[0]。
IntelliSense建议
gwe
class A {
    class B {
    public:
        int gwe = 0;
    };

    array<B, 3> arr;

public:
    A() {
        arr[0].gwe; // When starting to type 'g', IDE will suggest autocompletion for 'gwe'
    }
};