Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Bers
Заблокирован
#1

Баг компилятора? Или я чего то не догоняю? - C++

08.11.2011, 20:36. Просмотров 1718. Ответов 33
Метки нет (Все метки)

Компилил в 2008 студии. Вопрос: ПОЧЕМУ ЭТОТ КОД КОМПИЛИРУЕТСЯ?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Bee
{
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>&)
    {
        return *this;
    }
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<float> bee2;  
    bee1 = bee2;
 
    return 0;
}
/зы
Данный код не мой. Случайно нашёл в интернете. Заинтриговало. Решил поделится с народом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2011, 20:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Баг компилятора? Или я чего то не догоняю? (C++):

std::regex : баг на сайте или баг компилятора? - C++
http://en.cppreference.com/w/cpp/regex/regex_match этот код выкидывает throw... Добавлено через 35 секунд компилятор gcc 4.8

Баг компилятора или я дурак? - C++
До:http://www.cyberforum.ru/attachment.php?attachmentid=840160&amp;stc=1&amp;d=1496427343 ...

Баг компилятора???????? - C++
Почему первая программа дает 6, а вторая 11? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; int _tmain(int argc, _TCHAR* argv) { int...

Баг компилятора? - C++
Набросал вот такой код: // &lt;@r!er&gt; &lt;wtf&gt; &lt;26.05.2012&gt; #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace...

Баг asio? или баг TCP стека? - C++
всем привет. повстречался с очень странным багом. и не могу определить кто бажит, asio, или TCP-стек. на стороне клиента,...

Вложенные CMap или CArray-объекты. Ошибка компилятора или неправильная работа. - C++
Имеется: struct OPER { CString name; //название CString symbol; //обозначение };

33
Bers
Заблокирован
09.11.2011, 20:08  [ТС] #16
easybudda, скомпилируйте код из #8 сообщения, или #13
0
DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 20:09 #17
Кстати в 2010 тоже компилится код, хоть и ИДЕ выделяет ошибку в тексте... Думаю, надо у мелкомягких спрашивать.
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,848
09.11.2011, 20:11 #18
Цитата Сообщение от Bers Посмотреть сообщение
Прекрасно компилируется
В таком виде студия компилирует, gcc ругается.
Код
C:\c_cpp\shitcode>cl bers_bee.cpp
Оптимизирующий 32-разрядный компилятор Microsoft (R) C/C++ версии 15.00.30729.01
 для 80x86
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

bers_bee.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:bers_bee.exe
bers_bee.obj

C:\c_cpp\shitcode>g++ -o bers_bee bers_bee.cpp
bers_bee.cpp: In function 'int main()':
bers_bee.cpp:9:10: error: 'Bee<Foo>& Bee<Foo>::operator=(const Bee<Foo2>&) [with
 Foo2 = float, Foo = int, Bee<Foo> = Bee<int>]' is private
bers_bee.cpp:21:12: error: within this context

C:\c_cpp\shitcode>
Не понятно только, какой профит с этих заморочек?
0
Bers
Заблокирован
09.11.2011, 20:16  [ТС] #19
Цитата Сообщение от easybudda Посмотреть сообщение
Не понятно только, какой профит с этих заморочек?
Речь же не о том, как это можно использовать.
А о том, почему студия такое пропускает.
Это же нарушение инкапсуляции.
0
DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 20:19 #20
Bers,
В общем, писать мелкомягким баг манифест и призвать их к ответу
0
Bers
Заблокирован
09.11.2011, 20:23  [ТС] #21
Цитата Сообщение от DKOI Посмотреть сообщение
В общем, писать мелкомягким баг манифест и призвать их к ответу
За моральный ущерб трясти будим?
0
DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 20:24 #22
А то, мы их на такие деньги посадим, будут знать, как нарушать инкапсуляцию
0
Сыроежка
Заблокирован
09.11.2011, 20:27 #23
Цитата Сообщение от Bers Посмотреть сообщение
Компилил в 2008 студии. Вопрос: ПОЧЕМУ ЭТОТ КОД КОМПИЛИРУЕТСЯ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class Foo>
class Bee
{
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>&)
    {
        return *this;
    }
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<float> bee2;  
    bee1 = bee2;
 
    return 0;
}
/зы
Данный код не мой. Случайно нашёл в интернете. Заинтриговало. Решил поделится с народом.
Я подправил ваш исходный код, добавив шаблонный параметр, как уже здесь было предложено. Вообще-то, код не должен компилироваться, так как шаблонный оператор присваивания является закрытым. То есть два оператора присваивания должны участвовать в "конкурсе" на выбор наиболее подходящего - это копирующий оператор присваивания, который создан неявно компилятором, и данный шаблонный оператор присваивания. Так как лучше подходит шаблонный оператор присваивания, то он и должен быть выбран. Но так как он закрытый, то компилятор должен выдать сообщение об ошибке.
0
prazuber
110 / 110 / 3
Регистрация: 29.04.2010
Сообщений: 240
09.11.2011, 20:34 #24
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я подправил ваш исходный код, добавив шаблонный параметр, как уже здесь было предложено. Вообще-то, код не должен компилироваться, так как шаблонный оператор присваивания является закрытым. То есть два оператора присваивания должны участвовать в "конкурсе" на выбор наиболее подходящего - это копирующий оператор присваивания, который создан неявно компилятором, и данный шаблонный оператор присваивания. Так как лучше подходит шаблонный оператор присваивания, то он и должен быть выбран. Но так как он закрытый, то компилятор должен выдать сообщение об ошибке.
Спасибо, кэп. Вопрос в том, почему компилятор ошибки не выдает? MSVS 2008.
0
Сыроежка
Заблокирован
09.11.2011, 20:35 #25
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Спасибо, кэп. Вопрос в том, почему компилятор ошибки не выдает? MSVS 2008.
Это вопрос не ко мне, а к разработчикам компилятора.
Очевидно, что не выдает ошибку потому, что из двух операторов присваивания выбирает созданный им самим неявно оператор присваивания. Ведь, как я уже указал, в конкурсе участвуют два оператора присваивания.
0
prazuber
110 / 110 / 3
Регистрация: 29.04.2010
Сообщений: 240
09.11.2011, 20:42 #26
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это вопрос не ко мне, а к разработчикам компилятора.
Очевидно, что не выдает ошибку потому, что из двух операторов присваивания выбирает созданный им самим неявно оператор присваивания. Ведь, как я уже указал, в конкурсе участвуют два оператора присваивания.
Очевидное и невероятное.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class Foo>
class Bee
{
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>&)
    {
        cout<<"Hello!"<<endl;
        return *this;
    }
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<double> bee2;  
    bee1 = bee2;
 
    return 0;
}
Hello!
Для продолжения нажмите любую клавишу . . .
Правильно компилятор все выбирает.
0
Сыроежка
Заблокирован
09.11.2011, 20:50 #27
Цитата Сообщение от PraZuBeR Посмотреть сообщение
Очевидное и невероятное.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class Foo>
class Bee
{
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>&)
    {
        cout<<"Hello!"<<endl;
        return *this;
    }
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<double> bee2;  
    bee1 = bee2;
 
    return 0;
}
Правильно компилятор все выбирает.
Я уже написал, что этот код некорректный, так как происходит обращение к закрытому члену класса. То есть выбирает оператор присваивания он правильно (если верить вам), но тем не менее код не должен компилироваться, так как отсутствует право доступа.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,544
Завершенные тесты: 3
09.11.2011, 21:18 #28
Он с любым шаблонным оператором так себя ведет. Дико странно.
0
DKOI
24 / 24 / 1
Регистрация: 08.09.2010
Сообщений: 136
09.11.2011, 21:24 #29
Цитата Сообщение от ForEveR Посмотреть сообщение
Он с любым шаблонным оператором так себя ведет. Дико странно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template <class Foo>
class Bee
{
public:
    Bee(): m_test(555) {}
    int m_test;
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>& ist)
    {
        m_test= ist.m_test;
        return *this;
    }
    
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<int> bee2;  
    bee1 = bee2;
 
    return 0;
}
Вызывается стандартный оператор, а не переопределенный.
0
Сыроежка
Заблокирован
09.11.2011, 21:26 #30
Цитата Сообщение от DKOI Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template <class Foo>
class Bee
{
public:
    Bee(): m_test(555) {}
    int m_test;
private:
    template<class Foo2>
    Bee& operator =(const Bee<Foo2>& ist)
    {
        m_test= ist.m_test;
        return *this;
    }
    
};
 
int main (void)
{
    Bee<int> bee1;  
    Bee<int> bee2;  
    bee1 = bee2;
 
    return 0;
}
Вызывается стандартный, оператор а не переопределенный.
Один говорит, что у него в MS VC++ вызывается шаблонный оператор присваивания, другой говорит, что вызывается неявно определенный.

Вы уж, плиз, указывайте конкретно, какой компилятор вы используете!

Но в любом случае, как я уже написал в своем первом сообщении, код не должен компилироваться.
0
09.11.2011, 21:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2011, 21:26
Привет! Вот еще темы с ответами:

Ошибка компилятора или недостаток знаний - C++
Недавно начал писать библиотеку, и сегодня когда мне нужно было в функции принимать rvalue, и заметил одну странность, в VS17 auto...

Баг или фича - C++
решил проверить на своем VS 2008 присвоение в сравнении написал char buf; char *buf1; if(buf1=buf) все прошло никакого...

Ошибка или баг в Dev C++? - C++
помогите разобраться: вот простой код #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; class card { public: ...

Ввод/вывод баг или нет? - C++
#include &lt;iostream&gt; #include &lt;iterator&gt; #include &lt;string&gt; using namespace std; ostream_iterator&lt;string&gt; oo(cout); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru