Полученный доступ шаблонного класса к членским данным базового класса

Расширяться. Ответ Anyi.9, необходимо также знать различные типы разрыва строки во всеобщем употреблении . Зависящий от того, где Ваш файл произошел, можно хотеть посмотреть на проверку, что Вы ловите все альтернативы...

string replaceWith = "";
string removedBreaks = Line.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);

должен получить Вас движение...

60
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

Вы можете использовать this -> , чтобы прояснить, что вы имеете в виду член класса:

void Bar<T>::BarFunc () {
    std::cout << this->_foo_arg << std::endl;
}

В качестве альтернативы вы также можете использовать ", используя "в методе:

void Bar<T>::BarFunc () {
    using Bar<T>::_foo_arg;             // Might not work in g++, IIRC
    std::cout << _foo_arg << std::endl;
}

Это дает понять компилятору, что имя члена зависит от параметров шаблона, поэтому он ищет определение этого имени в нужных местах. Для получения дополнительной информации также см. эту запись в C ++ Faq Lite .

64
ответ дан 24 November 2019 в 17:51
поделиться

Кажется, отлично работает в Visual C ++ 2008. Я добавил несколько фиктивных определений для типов, которые вы упомянули, но не указал источника. В остальном именно так, как вы выразились. Затем основная функция для принудительного создания и вызова BarFunc .

#include <iostream>

class streamable {};
std::ostream &operator<<(std::ostream &os, streamable &s) { return os; }

class foo_arg_t : public streamable {};
class a_arg_t : public streamable {};
class b_arg_t : public streamable  {};

template <class T>
class Foo {

public:
    Foo (const foo_arg_t foo_arg) : _foo_arg(foo_arg)
    {
        /* do something for foo */
    }
    T Foo_T;        // either a TypeA or a TypeB - TBD
    foo_arg_t _foo_arg;
};

template <class T>
class Bar : public Foo<T> {
public:
    Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
    : Foo<T>(bar_arg)   // base-class initializer
    {

        Foo<T>::Foo_T = T(a_arg);
    }

    Bar (const foo_arg_t bar_arg, const b_arg_t b_arg)
    : Foo<T>(bar_arg)
    {
        Foo<T>::Foo_T = T(b_arg);
    }

    void BarFunc ();

};

template <class T>
void Bar<T>::BarFunc () {
    std::cout << _foo_arg << std::endl; 
    std::cout << Bar<T>::_foo_arg << std::endl;   
}

int main()
{
    Bar<a_arg_t> *b = new Bar<a_arg_t>(foo_arg_t(), a_arg_t());
    b->BarFunc();
}
1
ответ дан 24 November 2019 в 17:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: