шаблонная функция, принимающая аргумент шаблона - PullRequest
1 голос
/ 24 сентября 2011

Работа над простым примером для шаблонных функций.Код компилируется и работает как положено.Но мой вопрос, почему «static» требуется как в «Cmp», так и в «Lit»?Иначе он не скомпилируется?

Большое спасибо!

template<class T> class Cmp{
public:
    static int work(T a, T b) {
        std::cout << "Cmp\n";
        return 0;
    }
};

template<class T> class Lit{
public:
    static int work(T a, T b){
        std::cout << "Lit\n"  ;   
        return 0;
    }
};

template<class T, class C>
int compare(const T &a, const T &b){
    return C::work(a, b);
}


void test9(){
    compare<double, Cmp<double> >( 10.1, 20.2);
    compare<char, Lit<char> >('a','b');
}

Ответы [ 2 ]

3 голосов
/ 24 сентября 2011

C::work(a, b) называет статическую функцию-член work() класса C.

1 голос
/ 24 сентября 2011

Причина, по которой здесь требуется static, заключается в том, что в шаблонной функции compare имеется следующая строка:

return C::work(a, b);

Синтаксис C::work(a, b) здесь означает "вызов функции workвложенный в класс C. Как правило, он пытается вызвать функцию-член без предоставления объекта-получателя. Таким образом, обычно вы вызываете функцию work, если написать

C myCObject;
myCObject.work(a, b);

В этом случае, однако, мы не хотим вызывать функцию-член. Вместо этого мы хотим, чтобы функция work была похожа на обычную функцию в том смысле, что мы можем вызывать ее в любое время без ее относительного действия.другому объекту. Следовательно, мы помечаем эти функции static, чтобы их можно было вызывать как обычные функции.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...