注册 登录
编程论坛 C++教室

C++模板类继承中诡异的作用域问题

xyath 发布于 2009-11-07 14:45, 1217 次点击
C++模板类继承中诡异的作用域问题
帖子由 tiger » 2009-08-19 18:30
下面一段代码,大家可以试试,这样的问题经常被人忽略,出错还很难查:
代码: 全选
    /*
    * template_scope.cpp
    *
    *  Created on: 2009-8-19 下午06:13:28
    *      Author: kwarph
    *         Web: http://www.
    *        Mail: kwarph@
    */
    #include <iostream>
    using namespace std;
    int x = 8;
    void print() {
        cout << "hello" << endl;
    }
    template<typename T>
    class B {
    public:
        B() :
            x(0) {
        }
        explicit B(const int& v) :
            x(v) {
        }
        void print() const {
            cout << "B::print()" << endl;
        }
    protected:
        int x;
    };
    template<typename T>
    class A: public B<T> {
    public:
        void test_scope() const {
            cout << "x = " << x << endl; // 引用全局的x,输出 x = 8
            // cout << "x = " << B<T>::x << endl; // 必须显式调用父类的x
            print(); // 调用全局的print(),输出 hello
            // B<T>::print(); // 必须显式调用父类的函数
        }
    };
    class C {
    public:
        C() :
            x(0) {
        }
        explicit C(const int& v) :
            x(v) {
        }
        void print() const {
            cout << "C::print()" << endl;
        }
    protected:
        int x;
    };
    class D: public C {
    public:
        void test_scope() const {
            cout << "x = " << x << endl; // 用父类的x,输出:  x = 0
            print(); // 调用父类的print(),输出: C::print()
        }
    };
    int main() {
        A<int> a;
        a.test_scope();
        D d;
        d.test_scope();
    }

但是非模板类继承就没有这些问题。
3 回复
#2
flyingcloude2009-11-08 14:56
的确忽略了,学习了
#3
flyingcloude2009-11-08 18:01
刚刚仔细了去测试了下,发下LZ说的问题在VC编译器中不存在。但是在g++中存在着LZ说的这个问题

下面看看我几个测试的例子:
例子1:在VC,G++中都能够正确运行。
程序代码:

#include <iostream>
using namespace std;
template<class T>
class A
{
public:
    void print(){ cout << "class A" << '\n';}
};
template<class T>
class B:public A<T>
{
public:  
//    void print_test(){print(); }
};
int main()
{
    B<int> b;
//    b.print_test();
    b.print();
}

例子2:在VC中能够正确运行,而在G++中编译出错。代码跟例子1基本相同,只是把例子1的代码稍作修改,
程序代码:

#include <iostream>
using namespace std;
template<class T>
class A
{
public:
    void print(){ cout << "class A" << '\n';}
};
template<class T>
class B:public A<T>
{
public:  
    void print_test(){print(); }
};
int main()
{
    B<int> b;
    b.print_test();
    b.print();
}

例子3:在VC,G++中都能够正确运行。
程序代码:
#include <iostream>
using namespace std;
template<class T>
class A
{
public:
    void print(){ cout << "class A" << '\n';}
};
template<class T>
class B:public A<T>
{
public:  
    void print_test(){this->print(); }
};
int main()
{
    B<int> b;
    b.print_test();
    b.print();
}

哪位大虾解释一下,这个是为什么?
#4
kobe092042009-11-08 18:22
好像以前真没有注意这个问题 ,谢楼主了
1