首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免旧模板库中的“未声明”错误而不更改所有代码以使用此->?

如何避免旧模板库中的“未声明”错误而不更改所有代码以使用此->?
EN

Stack Overflow用户
提问于 2018-11-11 17:29:07
回答 1查看 59关注 0票数 0

在试图编译包含高度模板代码的库时,我得到了“在此范围内未声明”错误。该代码似乎是使用gcc-2.95开发的,而且(据我所知)大约四年前就已经编译了。正如我在StackOverflowC++-常见问题上所发现的,代码确实会失败,并且似乎依赖于不合格的编译。

最小重放示例,用gcc -c example.cpp编译

代码语言:javascript
复制
// file: example.cpp
template <typename T>
class Base {
  protected:
    int i;
};

template <typename T>
class Derived : protected Base<T> {
  public:
    void f() {
        // i = 5;     // Error: i was not declared in this scope
        this->i = 5;  // compiles
    }
};

我的问题是:如何使用更新的编译器编译这个库?

库代码在所有地方都使用错误语法(i=5),因此我倾向于避免手动将整个库更改为'this->i=5‘。提供的链接建议‘使用’语句,但这将减少我的工作,我喜欢的方法将不涉及代码更改,但迫使编译器对这些变量进行“假设”的旧行为。在这种情况下,我找不到编译器开关,-std=c++98-fpermissive等无法工作.

引用C++-FAQ:

也许令人惊讶的是,以下代码是无效的C++,尽管一些编译器接受它:

我还尝试使用CLang++,结果也是一样的。哪些编译器将接受此代码而不进行更改?

编辑:按照布莱恩的建议,在-fpermissive上添加了信息

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-11 18:06:35

不幸的是,正如@Mat在评论中所说的那样,这里唯一可行的选择是更正代码(您已经向您展示了如何这样做)。

这是两阶段名称查找的结果,因此要让编译器接受它,您需要一个不实现两阶段名称查找的编译器。使用微软的编译器,您可以使用-Zc:twoPhase-标志来获得当前编译器的旧行为(即让编译器接受您的代码)。

如果内存正常的话,g++的两阶段名称查找是相当正确的,从g++ 4.7开始。我很有信心,所有的g++ 3.x系列仍然会接受您的代码,早期的g++ 4.x可能也会接受,但是我非常肯定g++ 4.7和更高版本会拒绝它。

至于Clang-如果内存可用,它从一开始就有两个阶段的名称查找。早期的版本无疑有一些but,所以它们中的一个几乎不可能允许这样做,但我有点怀疑--这几乎是两阶段名称查找破坏现有代码的经典演示,所以任何试图实现两阶段名称查找的编译器几乎肯定都有类似的测试用例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53251331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档