Здравствуйте, Azir, Вы писали:
A>Встретил такую вещь: A>
A>class A
A>{
A> template<typename T>
A> A(T const& t)
A> {
this->>Do(t);
A> }
A> template<typename T>
A> void Do(T t);
A>};
A>
A>А почему это не записать так: A>
A>A(T const& t)
A>{
A> Do(t);
A>}
A>
C++ Templates: The Complete Guide
By David Vandevoorde
For class templates with base classes, using a name x by itself is not always equivalent to this->x, even though a member x is inherited. For example:
template <typename T>
class Base {
public:
void exit();
};
template <typename T>
class Derived : Base<T> {
public:
void foo() {
exit(); // calls external exit() or error
}
};
In this example, for resolving the symbol exit inside foo(), exit() defined in Base is never considered. Therefore, either you have an error, or another exit() (such as the standard exit()) is called.
We discuss this issue in Section 9.4.2 on page 136 in detail. For the moment, as a rule of thumb, we recommend that you always qualify any symbol that is declared in a base that is somehow dependent on a template parameter with this-> or Base<T>::. If you want to avoid all uncertainty, you may consider qualifying all member accesses (in templates).
Исправлено форматирование. Пожалуйста, не забывайте пользоваться тегами [c] ... [/c], [code] ... [/code] и т.п. для выделения фрагментов кода. -- ПК.
В большинстве случаях, если речь не идет о виртуальности, это вопрос стиля. например, можно взять за правило к членам текущего класса всегда обращаться через this, к членам базового через MyBaseName и пр. В общем as you like it.
Здравствуйте, Bell, Вы писали:
B>Так написать можно. Почему выбран первый вариант — лучше спросить у того, кто это написал.
Дело в том, что для вызова других методов используется 2-ой вариант.
PS Встретил это я в boost::BOOST_FUNCTION_FUNCTION
В таком простом примере в этом нет смысла, но в случае шаблонных классов с наследованием от зависимого типа есть разница. Пример:
template<class T>
class A : public T
{
public:
void f()
{
Do(); // #1
}
};
Этот код не верен так как при такой записи будет вызываться какая-то функция Do уже видимая в точке #1. Даже если у базовго класса T будут функция-член Do — она, по Стандарту, не позовется. Для того чтобы она позвалась она нужно написать, например, "this->Do()".
Здравствуйте, dupamid, Вы писали:
D>В таком простом примере в этом нет смысла, но в случае шаблонных классов с наследованием от зависимого типа есть разница.
Наследование имеет место, но не от зависимого класса.
В том же классе используется вариант вызова другого метода как Do2();, а не this->Do2();. Поэтому, я думаю, что автор осознанно применял оба варианта. Может быть я, упростив класс, исказил картину. Встретил это я в boost::BOOST_FUNCTION_FUNCTION.
Здравствуйте, Azir, Вы писали:
A>В том же классе используется вариант вызова другого метода как Do2();, а не this->Do2();. Поэтому, я думаю, что автор осознанно применял оба варианта. Может быть я, упростив класс, исказил картину. Встретил это я в boost::BOOST_FUNCTION_FUNCTION.
Тогда, скорее всего, это сделано не намерено, так как смысла не имеет. Возможно появилось при копировании кода из места, где это имело значение. Еще одно предположение, что это обход какой-то баги какого-то компилятора. Хотя в общем строить догадки можно много, но реально если изменить код на вызов просто вызов "assign_to" ничего поменятся не должно.
Иногда меня вдруг приперает использовать "this->" как "m_". Надеюсь превратить это в полезную привычку. Помогает при чтении чужих программ и своих в никаком состоянии.
Правильно работающая программа — просто частный случай Undefined Behavior