C++ 模板中的依赖名称

问题描述 投票:0回答:1

我有模板类,其中包括两个嵌套类,如下所示

#include <iostream>

template<typename A>
class c
{
    class a
    {
        protected:
        int i = 0;
    };
    class b: public a
    {
        public:
        void print()
        {
            std::cout << "i of a: " << i; // fails
            //std::cout << "i of a: " << this->i; // works
        }
    };
};

这提供了顺应性

error: use of undeclared identifier 'i'
。我预计失败与依赖于模板参数的类 a 相关,但这里的情况似乎并非如此,因为 a 不依赖于 A。 我尝试阅读有关模板中的从属名称的信息,但我仍然不确定为什么会发生此错误。有人可以解释这种行为的理论原因吗? 令人惊讶的是,这在 MSVC 上编译没有问题,但在 GCC 和 Clang 中却没有。任何关于为什么 GCC/Clang 的行为与 MSVC 不同的见解都将不胜感激!

c++ templates
1个回答
0
投票

因为

a
不依赖于
A

是的。你可以专攻

a

#include <iostream>

template<typename A>
class c
{
  public:
    class a
    {
      protected:
        int i = 0;
    };

    class b: public a
    {
      public:
        void print()
        {
            std::cout << "i of a: " << this->i; // works
        }
    };
};

template <>
class c<int>::a
{
    // No `i`!
};

int main()
{
    c<int>::b x;
    x.print();
}
<source>:18:46: error: no member named 'i' in 'c<int>::b'
   18 |             std::cout << "i of a: " << this->i; // works
      |                                        ~~~~  ^
© www.soinside.com 2019 - 2024. All rights reserved.