【问题标题】:C++ Clang template “use of undeclared identifier” Compiler FlagC++ Clang 模板“使用未声明的标识符”编译器标志
【发布时间】:2021-03-18 22:03:11
【问题描述】:

在 Clang 编译中这给了我错误

template<typename TYPE> struct Base
{
   bool variable;
};
template<typename TYPE> struct Ext : Base<TYPE>
{
   void clear() {variable=false;} // <- error here
};

错误:使用了未声明的标识符。

来自Why do I have to access template base class members through the this pointer?,我知道一种解决方法是使用“this->variable”,但总是使用起来很痛苦,是否有任何编译器标志可以禁用它?

我正在寻找一个 Clang 编译器标志选项来完全禁用此错误。在 MSVC 上,您可以使用“/permissive”命令行标志来做到这一点。我在 Clang 上寻找类似的选项,但“-fpermissive”标志不起作用。

【问题讨论】:

  • 重新发帖无济于事
  • C++ 不允许这样做。你需要一个不同语言的编译器。
  • 实际上它确实允许这样做。但是你需要this-&gt;variable=false;来改变variable的查找规则。

标签: c++ templates clang


【解决方案1】:

(更正:显然,某些编译器允许禁用此错误,请参阅上面的 OP)。

在此上下文中,variable 是一个依赖名称,因为它是依赖于模板参数的 Base&lt;T&gt; 的一部分。这是语言要求。

您可以将using Base&lt;Type&gt;::variable 放在派生类中,即

template<typename TYPE> struct Ext : Base<TYPE>
{
  using Base<TYPE>::variable;  // <- do this once per class

  void clear() {
    variable = false;          // <- this is fine now
  }
};

【讨论】:

  • 是的,你可以,在 MSVC 编译器上,你有一个选项“/permissive”可以解决这个问题。 Clang 为您提供 -fms-extensions 和 -fpermissive 但这没有帮助
  • 感谢您的更正,我的措辞不好。我的意思是你只能禁用“被视为错误/不被视为错误的警告”。话虽如此,上面的解决方案是我能想到的最好的解决方案。
  • 谢谢,我知道这一点,但是我要做的是,根本不必这样做,因为假设你有 100 个变量或方法,写“使用”或额外“this->”那是对IMO时间的巨大浪费。我认为编译器应该让程序员的生活变得轻松,而不是额外的困难。
  • @Esentel:这很公平。一种选择是让一个类包含所有非模板化的共享变量和一个单独的模板化类。然后,您可以从两者继承。如果可能,我倾向于避免多重继承,但这是一种替代方法。
【解决方案2】:

如果您在子类中使用this-&gt;variable 而不是variable,它也会起作用,因为这会改变变量的查找规则。

【讨论】:

  • 问题说 OP 知道这一点,但想要一个不同的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 2022-07-25
  • 1970-01-01
相关资源
最近更新 更多