Почему этот код перегрузки оператора C ++ работает в Clang, но не GCC/MSVC с C ++ 20?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему этот код перегрузки оператора C ++ работает в Clang, но не GCC/MSVC с C ++ 20?

Сообщение 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;
};


Подробнее здесь: https://stackoverflow.com/questions/796 ... -msvc-with
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»