Ошибка Compiler Error C2926
От: Аноним  
Дата: 13.02.04 08:28
Оценка:
Вот что пишет по её поводу МСДН:
'type' : types with no linkage cannot be used as template arguments

You cannot generate a template class (a class from a class template) based on a local type. Types used to instantiate templates must have external linkage.

Example
// C2926.cpp
template<class T> class X{};

void f()
{
    struct Y{};

    X<Y> x;        // C2926
}
int main()
{
}

Но почему так нельзя я не понимаю!
Може кто-нибудь из гуру объяснит в чем проблема?

Исправлено форматирование. Пожалуйста, пользуйтесь тегами [c] ... [/c], [code] ... [/code] и т.п. для выделения фрагментов кода. -- ПК.
Re: Ошибка Compiler Error C2926
От: Комаров Иван Россия  
Дата: 13.02.04 08:47
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Вот что пишет по её поводу МСДН:

А>'type' : types with no linkage cannot be used as template arguments

А>You cannot generate a template class (a class from a class template) based on a local type. Types used to instantiate templates must have external linkage.


А>Но почему так нельзя я не понимаю!

А>Може кто-нибудь из гуру объяснит в чем проблема?

Может поиск по сайту, например:
здесь
Автор: Павел Кузнецов
Дата: 13.01.03
Думай, прежде чем родиться в этой сказочной стране!
(с) Антон Духовской
Re: Ошибка Compiler Error C2926
От: LaptevVV Россия  
Дата: 13.02.04 10:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот что пишет по её поводу МСДН:

А>'type' : types with no linkage cannot be used as template arguments

А>You cannot generate a template class (a class from a class template) based on a local type. Types used to instantiate templates must have external linkage.


А>Example

А>
А>// C2926.cpp
А>template<class T> class X{};

А>void f()
А>{
А>    struct Y{};

А>    X<Y> x;        // C2926
А>}
А>int main()
А>{
А>}
А>

А>Но почему так нельзя я не понимаю!
А>Може кто-нибудь из гуру объяснит в чем проблема?

Сугубое ИМХО.
Если бы это было разрешено, то что получилось бы: строка Х<Y> x начала расширяться локальным типом. Результат инстанцирования — какой должен быть (локальный или глобальный), учитывая, что шаблон — глобальный? Если б я писал компилер, этот вопрос меня б смутил. Похоже на то, что тогда придется эту инстанцирование выполнять во время выпполнения программы, что принципиально противоречит идее шаблонов.
Если я не прав — более знающий народ меня поправит.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Ошибка Compiler Error C2926
От: Павел Кузнецов  
Дата: 13.02.04 10:35
Оценка: 19 (2)
Здравствуйте, LaptevVV, Вы писали:

А>> Example

А>>
 А>> template<class T> class X{};

 А>> void f()
 А>> {
 А>>    struct Y{};
 А>>    X<Y> x;        // C2926
 А>> }
 А>>


L> Сугубое ИМХО.

L> Если бы это было разрешено, то что получилось бы: строка Х<Y> x начала
L> расширяться локальным типом. Результат инстанцирования — какой должен быть
L> (локальный или глобальный), учитывая, что шаблон — глобальный?

В данном случае это не имеет значения. Важно только то, что имя полученного
типа должно быть уникально. Вот здесь и "порылась собака": локальность типа Y,
в частности, означает, что никакого уникального в рамках всей программы имени
с этим типом не связано. Соответственно, использовать для создания уникального
имени специализации X<Y> нечего. Есть предложение к комитету эту ситуацию
изменить:

Anthony Williams. Making Local Classes more Useful
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1427.pdf
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Ошибка Compiler Error C2926
От: LaptevVV Россия  
Дата: 13.02.04 14:08
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, LaptevVV, Вы писали:


А>>> Example

А>>>
 А>>> template<class T> class X{};

 А>>> void f()
 А>>> {
 А>>>    struct Y{};
 А>>>    X<Y> x;        // C2926
 А>>> }
 А>>>


L>> Сугубое ИМХО.

L>> Если бы это было разрешено, то что получилось бы: строка Х<Y> x начала
L>> расширяться локальным типом. Результат инстанцирования — какой должен быть
L>> (локальный или глобальный), учитывая, что шаблон — глобальный?

ПК>В данном случае это не имеет значения. Важно только то, что имя полученного

ПК>типа должно быть уникально. Вот здесь и "порылась собака": локальность типа Y,
ПК>в частности, означает, что никакого уникального в рамках всей программы имени
ПК>с этим типом не связано. Соответственно, использовать для создания уникального
ПК>имени специализации X<Y> нечего. Есть предложение к комитету эту ситуацию
ПК>изменить:

ПК>Anthony Williams. Making Local Classes more Useful

ПК>http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1427.pdf
Спасибо за ссылку.
Всеж-таки дальше я писал, что тогда вместо статического инстанцирования на этапе компиляции мы вынуждены будем перейти к динамическому инстанцированию во время выполнения. Такая "динамическая типизация" как раз в языках вроде Лиспа реализована и в корне противоречит идеям С++.
Ы?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Ошибка Compiler Error C2926
От: Павел Кузнецов  
Дата: 13.02.04 14:19
Оценка:
Здравствуйте, LaptevVV, Вы писали:

А>>>>
 А>>>> template<class T> class X{};

 А>>>> void f()
 А>>>> {
 А>>>>    struct Y{};
 А>>>>    X<Y> x;        // C2926
 А>>>> }
 А>>>>


L> Всеж-таки дальше я писал, что тогда вместо статического инстанцирования на

L> этапе компиляции мы вынуждены будем перейти к динамическому инстанцированию
L> во время выполнения. <...>

Не будет там инстанциирования во время выполнения. Прямо во время компиляции
будет инстанциироваться шаблон, специализации будет дано соответствующее имя, —
и все дела.
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.