Копмилятор
От: VNG Беларусь https://organicmaps.app/
Дата: 06.02.04 11:21
Оценка:
Вот такой код компилирую в MSVC++7.1
namespace Decl
{
    template <class T> void Foo1(T);
    template <class T> void Foo2(T);
};

class CFoo
{
    int dummy;

    template <class T>
    friend void Decl::Foo1<T>(T);
    template <class T>
    friend void Decl::Foo2<T>(T);
};

Выдает ошибку компиляции: error C2951: template declarations are only permitted at global or namespace scope

Если поменяю местами строчки и получу:
namespace Decl
{
    template <class T> void Foo1(T);
    template <class T> void Foo2(T);
};

class CFoo
{
    template <class T>
    friend void Decl::Foo1<T>(T);

    int dummy;

    template <class T>
    friend void Decl::Foo2<T>(T);
};

то все нормально. Это меня глючит или это ошибка компилятора???

Исправлено форматирование. Пожалуйста, пользуйтесь тегами [c] ... [/c], [code] ... [/code] и т.п. для выделения фрагментов кода. -- ПК.
Re: Копмилятор
От: Lorenzo_LAMAS  
Дата: 06.02.04 11:27
Оценка:
VNG>class CFoo
VNG>{
VNG>    int dummy;

VNG>    template <class T>
VNG>    friend void Decl::Foo1(T);
VNG>    template <class T>
VNG>    friend void Decl::Foo2(T);
VNG>};


А если так?
Of course, the code must be complete enough to compile and link.
Re[2]: Копмилятор
От: VNG Беларусь https://organicmaps.app/
Дата: 06.02.04 17:11
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>
VNG>>class CFoo
VNG>>{
VNG>>    int dummy;

VNG>>    template <class T>
VNG>>    friend void Decl::Foo1(T);
VNG>>    template <class T>
VNG>>    friend void Decl::Foo2(T);
VNG>>};
L_L>


L_L>А если так?


Все равно ошибка. Компилируется только тогда, когда int dummy; стоит между двумя объявлениями friend функций.
А в принципе вместо template <class T> friend void Decl::Foo1<T>(T);
можно написать и template <class T> friend void Decl::Foo1(T);
но мне кажется, что первый вариант более корректен. Или я не прав?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.