Здравствуйте, Аноним, Вы писали:
NB>>до инстанцирования magic<-1> есть только engine(...); NB>>после добавляется engine(magic<-1>);
А>А ты не думал, что поиск имен не зависит от инстанцирования и вещи это ортогональные?
похоже у моего любимого компилятора на этот счет есть свое мнение
Re[7]: Невероятно, но факт! Не константные значения в компай
От:
Аноним
Дата:
07.02.07 12:31
Оценка:
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, Аноним, Вы писали:
NB>>>до инстанцирования magic<-1> есть только engine(...); NB>>>после добавляется engine(magic<-1>);
А>>А ты не думал, что поиск имен не зависит от инстанцирования и вещи это ортогональные?
NB> NB>похоже у моего любимого компилятора на этот счет есть свое мнение
Дак это-то понятно, что это особенности компилятора.
Re[8]: Невероятно, но факт! Не константные значения в компай
Здравствуйте, Аноним, Вы писали:
А>>>А ты не думал, что поиск имен не зависит от инстанцирования и вещи это ортогональные?
NB>> NB>>похоже у моего любимого компилятора на этот счет есть свое мнение
А>Дак это-то понятно, что это особенности компилятора.
назови хоть один, который компилит правильно
Re[5]: Невероятно, но факт! Не константные значения в компай
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, Аноним, Вы писали: А>>Т.е. поиск имен, по-твоему, зависит от того, сколько ты раз написал magic<> ? NB>поиск имен зависит от того, какие аргументы принимает функция. NB>если функия принимает аргументом magic, то поиск подходящей функции будет происходит и в пространстве magic.
Вообще-то говоря у тебя не совсм так написано...
у тебя engine в глобальном пространстве вроде. Это эе друг?
А ещё, кстати, в оюласть поиска имён входит не сам тип аргумента, а пространство, где он был объявлен..
Так что я, например, не понял, от чего это всё должно работать.
И главное. Я так и не смог найти где же подстановка аргументов шаблона либо формирование списка областей где искать, зависит от того, какие шаблоны уже ьыли инстанциированы.
ИМХО ты пользуешься дыркой в стандарте, когда ты объявляешь, фактически шаблонную функцию, как нешаблонную.
template<typename T>
class FriendFake {
friend void foo( T ) {}
};
Вроде как мы при инстанциировании шаблона FriendFake за одно породили нешаблонную функцию foo.
(Почему нешаблонную? Да потому что при её вызове не будет явно или неявно выводится параметры шаблона)
ИМХО поиск и участие таких функций в разрешении неоднозначнойстей при вызове -- нифига в шаблоне не специфицированы и являются особенностью реализации шаблонов в компилятрое
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, night beast, Вы писали:
NB> NB>похоже у моего любимого компилятора на этот счет есть свое мнение
Будь твёрд в своей любви!
Это соркк особенности обсуждаемого кода!
В целом хотелось бы узнать почему автору кажется, что это чмстый и стандартный C++...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Невероятно, но факт! Не константные значения в компай
Здравствуйте, Erop, Вы писали:
E>Вообще-то говоря у тебя не совсм так написано... E>у тебя engine в глобальном пространстве вроде. Это эе друг? E>А ещё, кстати, в оюласть поиска имён входит не сам тип аргумента, а пространство, где он был объявлен..
Здравствуйте, Lorenzo_LAMAS, Вы писали:
E>>В целом хотелось бы узнать почему автору кажется, что это чмстый и стандартный C++...
L_L>Ну, он этого вроде и не утверждал.
Аааа, утверждал, я разглядел теперь.
Не нравятся мне подобные кошмарики на С++
Of course, the code must be complete enough to compile and link.
Re: А INTERNAL COMPILER ERROR тоже вызывает ажиотаж?
Идея в том, что ты хочешь шаблонно заводить нешаблонную функцию в глобальном пространстве имён. Типа так:
template<typename T>
class FriendHack {
friend foo( T ) { } // разве foo -- шаблонная?
};
АФАИК foo -- она не шаблонная. И где она там получается определённой и как и когда появится при поиске кандидатов, при разрешении неоднозначноти вроде никак не гарантируется.
Соответсвенно, если тебе кажется, что это стандартное поведение, то не плохо бы было сделать две вещи
1) Найти где в стандарте описано, как это должно работать.
2) Написать простой пример и проверить работает ли это... додаток1
Возможный контрольный пример:
додаток2
За то, что я прав, голосует ещё и то, что даже у M$ не всё так классно. Если бы всё было так, как ты думаешь, то в функции engine вроде как не был бы нужен второй аргумент...
Увы, в этот раз, похоже, опять не получилось
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Невероятно, но факт! Не константные значения в компай
E>И главное. Я так и не смог найти где же подстановка аргументов шаблона либо формирование списка областей где искать, зависит от того, какие шаблоны уже ьыли инстанциированы.
+1.
Of course, the code must be complete enough to compile and link.
Re: Невероятно, но факт! Не константные значения в компайл-т
Здравствуйте, remark, Вы писали:
R>Сейчас вы увидите, как на стандартном с++ можно иметь переменные значения в компайл-тайм!
Это не стандартный C++
7.3.1.2/3
Every name first declared in a namespace is a member of that namespace. If a friend declaration in a
non-local class first declares a class or function the friend class or function is a member of the innermost
enclosing namespace. The name of the friend is not found by simple name lookup until a matching declaration
is provided in that namespace scope (either before or after the class declaration granting friendship). If
a friend function is called, its name may be found by the name lookup that considers functions from namespaces
and classes associated with the types of the function arguments (3.4.2). When looking for a prior
declaration of a class or a function declared as a friend, and when the name of the friend class or
function is neither a qualified name nor a template-id, scopes outside the innermost enclosing namespace
scope are not considered. [Example:
// Assume f and g have not yet been defined.void h(int);
template <class T> void f2(T);
namespace A {
class X {
friend void f(X); // A::f(X) is a friendclass Y {
friend void g(); // A::g is a friendfriend void h(int); // A::h is a friend
// ::h not consideredfriend void f2<>(int); // ::f2<>(int) is a friend
};
};
// A::f, A::g and A::h are not visible here
X x;
void g() { f(x); } // definition of A::gvoid f(X) { /* ... */} // definition of A::fvoid h(int) { /* ... */ } // definition of A::h
// A::f, A::g and A::h are visible here and known to be friends
}
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Не нравятся мне подобные кошмарики на С++
Не парься!
Это не C++, а просто дырка в стандарте.
Кажется давно уже известная, кстати
Через неё любят хачить убогость шаблонов шестой студии, например
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Невероятно, но факт! Не константные значения в компай
E>Вроде как мы при инстанциировании шаблона FriendFake за одно породили нешаблонную функцию foo. E>(Почему нешаблонную? Да потому что при её вызове не будет явно или неявно выводится параметры шаблона)
Нет эта функцию имеем еще до инстацирования шаблона. А в VC баг. См. 7.3.1.2/3 или http://rsdn.ru/Forum/Message.aspx?mid=2339364&only=1
E>ИМХО поиск и участие таких функций в разрешении неоднозначнойстей при вызове -- нифига в шаблоне не специфицированы и являются особенностью реализации шаблонов в компилятрое
Re[9]: Невероятно, но факт! Не константные значения в компай
От:
Аноним
Дата:
07.02.07 13:39
Оценка:
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, Аноним, Вы писали:
А>>>>А ты не думал, что поиск имен не зависит от инстанцирования и вещи это ортогональные?
NB>>> NB>>>похоже у моего любимого компилятора на этот счет есть свое мнение
А>>Дак это-то понятно, что это особенности компилятора.
NB>назови хоть один, который компилит правильно
Я думаю, Комо, а скорее всего, последний фронт-энд от едг (у Комо он какой-то древний уже). Уж если ЕДГ и глючит, то в совсем уж нетривиальных моментах.
Автор упомянул ЕДГ, но я не понял, что это значит — купить его простым смертным — малореально
Re[10]: Невероятно, но факт! Не константные значения в компа
Здравствуйте, Аноним, Вы писали:
А>>>Дак это-то понятно, что это особенности компилятора.
NB>>назови хоть один, который компилит правильно
А>Я думаю, Комо, а скорее всего, последний фронт-энд от едг (у Комо он какой-то древний уже). Уж если ЕДГ и глючит, то в совсем уж нетривиальных моментах.
Комо считает, что правильным является char engine(...)
что имхо не правильно.
Re[6]: Невероятно, но факт! Не константные значения в компай
реально она нужна только для типа FriendFake<int>.
извне она не видна, но из-за ADL ее можно вызвать.
E>ИМХО поиск и участие таких функций в разрешении неоднозначнойстей при вызове -- нифига в шаблоне не специфицированы и являются особенностью реализации шаблонов в компилятрое
а вот и нет
подробнее C++ Templates: The Complete Guide (11.7 The Barton-Nackman Trick)
Re[11]: Невероятно, но факт! Не константные значения в компа
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, Аноним, Вы писали:
А>>>>Дак это-то понятно, что это особенности компилятора.
NB>>>назови хоть один, который компилит правильно
А>>Я думаю, Комо, а скорее всего, последний фронт-энд от едг (у Комо он какой-то древний уже). Уж если ЕДГ и глючит, то в совсем уж нетривиальных моментах.
NB>Комо считает, что правильным является char engine(...) NB>что имхо не правильно.
Хех, для начала надо попытаться обосновать, почему это неправильно
Кстати, как насчет этого:
вроде как равнозначны. Обе вводят в глобальное пространство имён нешаблонную функцию void foo( int, float )
Так что он вполне объявляет глобальную нешаблонную функцию с параметрами зависящими от того, в какой именно инстанциации шаблона класса она введена.
Как влияют эти функции напоиск кандидатов при разрешении неоднозначностей --
E>>ИМХО поиск и участие таких функций в разрешении неоднозначнойстей при вызове -- нифига в шаблоне не специфицированы и являются особенностью реализации шаблонов в компилятрое NB>а вот и нет NB>подробнее C++ Templates: The Complete Guide (11.7 The Barton-Nackman Trick)
The Barton-Nackman Trick -- то как раз известный. Кто бы спорил.
Но там где объхявляют, там и используют. А тут какие-то одни инстанциации, должны использовать какие-то другие инстанциации. Вроде как никто ничего про это не обещает.
Я вот, что-то не нашёл в стандарте сразу. Не стразу искать лень, так как мне кажется, что и не найду.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: Невероятно, но факт! Не константные значения в компа
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, night beast, Вы писали:
NB>>Здравствуйте, Аноним, Вы писали:
А>>>>>Дак это-то понятно, что это особенности компилятора.
NB>>>>назови хоть один, который компилит правильно
А>>>Я думаю, Комо, а скорее всего, последний фронт-энд от едг (у Комо он какой-то древний уже). Уж если ЕДГ и глючит, то в совсем уж нетривиальных моментах.
NB>>Комо считает, что правильным является char engine(...) NB>>что имхо не правильно.
А>Хех, для начала надо попытаться обосновать, почему это неправильно
попробую. поправь если где ошибся
template<typename type = int, int id = sizeof(engine(*(magicc*)0, *(type*)0))>
struct magic
{
friend int engine(magicc&, type&);
static const int val = id;
};
Здравствуйте, Erop, Вы писали:
NB>>реально она нужна только для типа FriendFake<int>. NB>>извне она не видна, но из-за ADL ее можно вызвать.
E>Да вот и нет! E>Вот скажи, декларация E>
void foo( FriendFake<int>, FriendFake<float> );
E>Объявляет шаблон функции разве?
вот здесь я не совсем понял вопроса
E>А ведь декларации E>
E>вроде как равнозначны. Обе вводят в глобальное пространство имён нешаблонную функцию void foo( int, float )
E>Так что он вполне объявляет глобальную нешаблонную функцию с параметрами зависящими от того, в какой именно инстанциации шаблона класса она введена.
да. здесь идет декларация глобальной функции.
но если ты во френде задашь и тело, то она уже будет принадлежать только тому классу, в котором появилась.
E>Как влияют эти функции напоиск кандидатов при разрешении неоднозначностей --
E>>>ИМХО поиск и участие таких функций в разрешении неоднозначнойстей при вызове -- нифига в шаблоне не специфицированы и являются особенностью реализации шаблонов в компилятрое NB>>а вот и нет NB>>подробнее C++ Templates: The Complete Guide (11.7 The Barton-Nackman Trick) E>The Barton-Nackman Trick -- то как раз известный. Кто бы спорил. E>Но там где объхявляют, там и используют. А тут какие-то одни инстанциации, должны использовать какие-то другие инстанциации. Вроде как никто ничего про это не обещает.
ну сэкономил человек на объявлении, что вы привязались.
суть то не в этом.