Шаблонные функции Friend (в не шаблонных классах), C ++ - PullRequest
4 голосов
/ 19 января 2009

Если у меня есть не шаблонный (то есть «нормальный») класс, и я хочу иметь функцию друга шаблона, как мне написать его, не вызывая ошибки компилятора? Вот пример, чтобы проиллюстрировать, что я пытаюсь сделать:

template <class T>
void bar(T* ptr);

class MyClass  // note that this isn't a template class
{
private:
    void foo();

    template <class T>
    friend void bar(T*);  // ERROR: compiler gives me all kinds of grief
};

template <class T>
void bar(T* ptr)
{
    if (ptr)
    {
        MyClass obj;

        obj.foo();
    }
}

Я использую Visual Studio 2005, и конкретная ошибка, которую мне дают, ошибка C2063 , утверждающая, что "bar" не является функцией. Что здесь нужно сделать иначе?

Ответы [ 2 ]

4 голосов
/ 19 января 2009

Вы уверены, что вы опубликовали ошибку? Следующее (с использованием Visual Studio 2005) прекрасно работает для меня:

#include <iostream>
template <class T>
void bar(T* ptr);

class MyClass  // note that this isn't a template class
{
private:
    void foo();

    template <class T>
    friend void bar(T*);  // ERROR: compiler gives me all kinds of grief
};

void MyClass::foo()
{
    std::cout << "fooed!" << std::endl;
}

template <class T>
void bar(T* ptr)
{
    if (ptr)
    {
        MyClass obj;

        obj.foo();
    }
}


int _tmain(int argc, _TCHAR* argv[])
{

    int someObj = 1;
    bar(&someObj);

    return 0;
}
0 голосов
/ 19 января 2009

Это скорее обходной путь, чем исправление, но вы пытались перечислить специализации как друзья?

...