派生对基类成员数据的模板类访问:用于从属名称

时间:2014-12-15 08:26:32

标签: c++ g++ dependent-name

在以下长代码列表中,请查找三个位置:

  1. // "this->" can be omitted before first data[0]
    1. // Compile error, if "this->" is omitted before first data[0]
      1. // likewise, "this->" is required.
      2. 我不知道为什么有时候“这个 - >”可以省略,有时也不能。

        编译错误是:main.cpp:19:3:错误:'data'未在此范围内声明

        它只是一个编译器错误吗?我的编译器是GCC v4.8.1和v4.8.2。谢谢。 实际上,顺便说一句,QtCreator的默认智能可以识别'data [0]'而不用“this->”在所有三个地方。

        这是代码清单:

        template <typename T>
        struct Vec3_
        {
            T data[3];
            inline Vec3_<T> & operator =(const Vec3_<T> & rhs) {
                if (this != &rhs) {
                    data[0] = rhs.data[0];  // "this->" can be omitted before first data[0]
                    data[1] = rhs.data[1];
                    data[2] = rhs.data[2];
                }
                return *this;
            }
        };
        
        template <typename T>
        struct Vec3i_: Vec3_<T>
        {
            inline Vec3i_<T> & operator ^=(const Vec3i_<T> & rhs) {
                data[0] ^= rhs.data[0];     // Compile error, if "this->" is omitted before first data[0]
                this->data[1] ^= rhs.data[1];
                this->data[2] ^= rhs.data[2];
                return *this;
            }
            inline Vec3i_<T> operator ^(const Vec3i_<T> & rhs) const {
                Vec3i_<T> tmp;
                tmp[0] = this->data[0] ^ rhs.data[0];  // likewise, "this->" is required.
                tmp[1] = this->data[1] ^ rhs.data[1];
                tmp[2] = this->data[2] ^ rhs.data[2];
                return tmp;
            }
        };
        
        Vec3i_<int> A;
        
        int main(int, char**) { return 0; }
        

        == update ==

        由于有人指出了一个非常相似的问题(可能是重复的)和答案,而且该问题的标题甚至是描述性的,我改变了我的标题(与参数依赖性差异除外)

        然而,在阅读了这个问题的答案之后,我仍然感到困惑。答案指向FAQ [link here],说如果变量是非依赖名称,编译器将不会在基本模板类中搜索名称。但是,在此示例中,变量(data)是从属名称,因为它的类型为T,而T是模板变量。

        我仍然愿意接听答案。

0 个答案:

没有答案