ошибка: запрошено преобразование из «фундаментального типа» в нескалярный тип «NamedType <фундаментальный тип>» - PullRequest
0 голосов
/ 26 мая 2019

У меня есть следующая структура (, достаточно упрощенная, чтобы воспроизвести проблему ):

template < class T, class P = struct NamedTypeDefaultTag > struct NamedType
{
    //static_assert(std::is_fundamental_v< T >, "Template parameter is not a fundamental type.");

    using ValueType = T;

    ValueType m{};

    constexpr NamedType() noexcept = default;
    constexpr NamedType(const NamedType & value) noexcept = default;
    constexpr NamedType(NamedType && value) noexcept = default;

    constexpr explicit NamedType(const T & value) noexcept : m{value} { }

    constexpr NamedType & operator = (const T & value) { m = value; return *this; }
};

И затем я пытаюсь использовать оператор присваивания следующим образом:

int main() {
    using NT_t = NamedType< int >;

    // generates error
    int t = 1;
    NT_t a = t;
    const NT_t b = 2;
    // works fine
    NT_t c;
    c = 2;

    return 0;
}

Я подозреваю, что, поскольку я объявляю это и назначаю его одновременно, он каким-то образом пытается использовать конструктор (который является явным).

Но я не понимаю, что его вызывает и как обойтиэто.

1 Ответ

0 голосов
/ 26 мая 2019

NT_t a = t; пытается неявное преобразование из int в NT_t. Но конструктор, способный выполнять такое преобразование, помечен explicit, что исключает его использование в неявных преобразованиях. Сделай это

NT_t a{t};
const NT_t b{2};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...