Недавно я столкнулся с интересным примером кода C ++, который компилируется с Clang (-Std = C ++ 20), но не сбоится с GCC и MSVC. Код включает в себя перегрузку оператора и объявления функции друга.#include
template
class Foo;
template
Foo operator+(int, const Foo&);
template
class Foo
{
public:
Foo(const T& val) : data(val) {}
Foo operator+(int);
friend Foo operator+(int, const Foo&);
private:
T data;
};
template
Foo Foo::operator+(int num)
{
return Foo(this->data + num);
}
template
Foo operator+(int num, const Foo& other)
{
return Foo(other.data + num);
}
int main()
{
Foo a(1);
auto v1 = a + 2;
auto v2 = 2 + a;
}
< /code>
Поведение компилятора:
clang (17.0.1): работает с -std = c ++ 20 < /p>
gcc (13.2): сбои с ошибкой в отношении оператора+не объявлен < /p>
msvc (v19.38): аналогично < /p>
gc Ошибка: < /p>
: In instantiation of 'class Foo':
:35:15: required from here
35 | Foo a(1);
| ^
:15:19: error: template-id 'operator+' for 'Foo operator+(int, const Foo&)' does not match any template declaration
15 | friend Foo operator+(int, const Foo&);
| ^~~~~~~~~~~
:22:8: note: candidate is: 'Foo Foo::operator+(int) [with T = int]'
22 | Foo Foo::operator+(int num)
| ^~~~~~
: In instantiation of 'Foo operator+(int, const Foo&) [with T = int]':
:37:19: required from here
37 | auto v2 = 2 + a;
| ^
:30:22: error: 'int Foo::data' is private within this context
30 | return Foo(other.data + num);
| ~~~~~~^~~~
:18:7: note: declared private here
18 | T data;
| ^~~~
< /code>
обходной путь:
Обмен заказ объявлений оператора внутри класса заставляет его работать: < /p>
template
class Foo
{
public:
Foo(const T& val) : data(val) {}
friend Foo operator+(int, const Foo&);
Foo operator+(int);
private:
T data;
};
Подробнее здесь: https://stackoverflow.com/questions/796 ... -msvc-with
Почему этот код перегрузки оператора C ++ работает в Clang, но не GCC/MSVC с C ++ 20? ⇐ C++
Программы на C++. Форум разработчиков
1746482256
Anonymous
Недавно я столкнулся с интересным примером кода C ++, который компилируется с Clang (-Std = C ++ 20), но не сбоится с GCC и MSVC. Код включает в себя перегрузку оператора и объявления функции друга.#include
template
class Foo;
template
Foo operator+(int, const Foo&);
template
class Foo
{
public:
Foo(const T& val) : data(val) {}
Foo operator+(int);
friend Foo operator+(int, const Foo&);
private:
T data;
};
template
Foo Foo::operator+(int num)
{
return Foo(this->data + num);
}
template
Foo operator+(int num, const Foo& other)
{
return Foo(other.data + num);
}
int main()
{
Foo a(1);
auto v1 = a + 2;
auto v2 = 2 + a;
}
< /code>
Поведение компилятора:
clang (17.0.1): работает с -std = c ++ 20 < /p>
gcc (13.2): сбои с ошибкой в отношении оператора+не объявлен < /p>
msvc (v19.38): аналогично < /p>
gc Ошибка: < /p>
: In instantiation of 'class Foo':
:35:15: required from here
35 | Foo a(1);
| ^
:15:19: error: template-id 'operator+' for 'Foo operator+(int, const Foo&)' does not match any template declaration
15 | friend Foo operator+(int, const Foo&);
| ^~~~~~~~~~~
:22:8: note: candidate is: 'Foo Foo::operator+(int) [with T = int]'
22 | Foo Foo::operator+(int num)
| ^~~~~~
: In instantiation of 'Foo operator+(int, const Foo&) [with T = int]':
:37:19: required from here
37 | auto v2 = 2 + a;
| ^
:30:22: error: 'int Foo::data' is private within this context
30 | return Foo(other.data + num);
| ~~~~~~^~~~
:18:7: note: declared private here
18 | T data;
| ^~~~
< /code>
обходной путь:
Обмен заказ объявлений оператора внутри класса заставляет его работать: < /p>
template
class Foo
{
public:
Foo(const T& val) : data(val) {}
friend Foo operator+(int, const Foo&);
Foo operator+(int);
private:
T data;
};
Подробнее здесь: [url]https://stackoverflow.com/questions/79607696/why-does-this-c-operator-overloading-code-work-in-clang-but-not-gcc-msvc-with[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия