在试图编译包含高度模板代码的库时,我得到了“在此范围内未声明”错误。该代码似乎是使用gcc-2.95开发的,而且(据我所知)大约四年前就已经编译了。正如我在StackOverflow和C++-常见问题上所发现的,代码确实会失败,并且似乎依赖于不合格的编译。
最小重放示例,用gcc -c example.cpp编译
// 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上添加了信息
发布于 2018-11-11 18:06:35
不幸的是,正如@Mat在评论中所说的那样,这里唯一可行的选择是更正代码(您已经向您展示了如何这样做)。
这是两阶段名称查找的结果,因此要让编译器接受它,您需要一个不实现两阶段名称查找的编译器。使用微软的编译器,您可以使用-Zc:twoPhase-标志来获得当前编译器的旧行为(即让编译器接受您的代码)。
如果内存正常的话,g++的两阶段名称查找是相当正确的,从g++ 4.7开始。我很有信心,所有的g++ 3.x系列仍然会接受您的代码,早期的g++ 4.x可能也会接受,但是我非常肯定g++ 4.7和更高版本会拒绝它。
至于Clang-如果内存可用,它从一开始就有两个阶段的名称查找。早期的版本无疑有一些but,所以它们中的一个几乎不可能允许这样做,但我有点怀疑--这几乎是两阶段名称查找破坏现有代码的经典演示,所以任何试图实现两阶段名称查找的编译器几乎肯定都有类似的测试用例。
https://stackoverflow.com/questions/53251331
复制相似问题