Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Функция


Автор: FelikZ 1.6.2007, 12:58
Привет! Помогите получить доступ к функции "T* A::Func()" из класса "B", потому как у меня ругается при попытке обратиться к ней... видимо изза плохого знания шаблонов :(

Код

#include "stdafx.h"
#include <iostream>
using namespace std;

template<typename T>
class A
{
protected:
    T *_t;
public:
    A()
    {
        _t = new T;
    }

    T* Func()
    {
        return _t;
    }

    virtual int Func(T* t)
    {
        if(t == NULL)
            return -1;
        _t = t;
        return 0;
    }
};

class B:
    public A<int>
{
public:
    B()
    {
    }

    virtual int Func(int* t)
    {
        _t = t;
        return 0;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    B b;
    int z = 0;            
    b.Func(&z);        //OK
    int a = b.Func();    //error C2660: 'B::Func' : function does not take 0 arguments
    
    return 0;
}



Автор: Fazil6 1.6.2007, 13:07
Цитата(FelikZ @  1.6.2007,  12:58 Найти цитируемый пост)
Привет! Помогите получить доступ к функции "T* A::Func()" из класса "B", потому как у меня ругается при попытке обратиться к ней...

в класе B у тебя  int Func(int* t) и поэтому он требует передачу аргумента в функцию

Автор: zkv 1.6.2007, 13:10
Цитата(FelikZ @  1.6.2007,  12:58 Найти цитируемый пост)
получить доступ к функции "T* A::Func()" из класса "B"

Код

int *a = b.A<int>::Func();

но я бы такие конструкции не стал употреблять вне методов класса smile

Автор: v_nikolaev 1.6.2007, 16:41
Цитата(zkv @ 1.6.2007,  13:10)
Цитата(FelikZ @  1.6.2007,  12:58 Найти цитируемый пост)
получить доступ к функции "T* A::Func()" из класса "B"

Код

int *a = b.A<int>::Func();

но я бы такие конструкции не стал употреблять вне методов класса smile

а почему всё же нужно явно указывать A<int>::, если мы наследуем от A<int> ?

Автор: FelikZ 1.6.2007, 19:46
zkv, 
Цитата(v_nikolaev @  1.6.2007,  16:41 Найти цитируемый пост)
а почему всё же нужно явно указывать A<int>::, если мы наследуем от A<int> ?

???

Автор: threef 1.6.2007, 20:21
Из-за того, что используется виртуальный метод с тем же именем. Он перекрывает метод базового класса.

Автор: FelikZ 1.6.2007, 20:43
zkv, threef, +1

Автор: archimed7592 1.6.2007, 22:07
суть даже не в перекрытие базового метода, а в скрытии имён... как только в B перекрывается одна из версий Func, все остальные функции с тем же именем становятся просто не видны в производном классе

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)