错误:"结束索引"中没有名为"rank_"的成员

error: no member named 'rank_' in 'EndIndex'

本文关键字:rank 成员 结束 索引 错误      更新时间:2023-10-16

>我正在尝试使用自动微分库 Adept 并使其适用于 gcc 4.9.0 和 icc 16.0.2,但在 VS 2017 和 Clang 4.0.1 中失败

我已经将问题简化为以下代码片段,当我与库创建者一起解决问题时,为了知识起见,我想知道为什么这段代码在提到的两个编译器中工作,而无法在其他两个编译器中构建。

template <typename A>
struct Expression
{
  static const int rank = A::rank_;
};
struct EndIndex : public Expression<EndIndex>
{
  static const int rank_ = 0;
};
int  main(int argc, char ** argv)
{
  return 0;
}

VS 2017 的输出为:

1>------ Build started: Project: Test, Configuration: Debug Win32 ------
1>Source.cpp
1>d:Testsource.cpp(4): error C2039: 'rank_': is not a member of 'EndIndex'
1>d:Testsource.cpp(7): note: see declaration of 'EndIndex'
1>d:Testsource.cpp(8): note: see reference to class template instantiation 'Expression<EndIndex>' being compiled
1>d:Testsource.cpp(4): error C2065: 'rank_': undeclared identifier
1>d:Testsource.cpp(4): error C2131: expression did not evaluate to a constant
1>d:Testsource.cpp(4): note: failure was caused by non-constant arguments or reference to a non-constant symbol
1>d:Testsource.cpp(4): note: see usage of 'rank_'
1>Done building project "Test.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

和 Clang 4.0.1 的输出:

source.cpp:4:37: error: no member named 'rank_' in 'EndIndex'
                              static const int rank = A::rank_;
                                                      ~~~^
source.cpp:7:38: note: in instantiation of template class 'Expression<EndIndex>' requested here
                                                      struct EndIndex : public Expression<EndIndex>

这可能是因为rank_在该阶段没有定义。

以下修复了 Apple LLVM 版本 9.0.0 (clang-900.0.38) 的问题:

template <typename A>
struct Expression
{
  static const int rank;
};
struct EndIndex : public Expression<EndIndex>
{
  static const int rank_ = 0;
};
template <typename A>
const int Expression<A>::rank = A::rank_;

Visual C++ 和 clang 根本无法找到EndIndex的成员rank_因为它是在声明之前被访问的。这种花哨的代码通常会导致某些环境中的问题。