Почему привязка привязки По умолчанию не выполняется? [Дубликат]

Сводка

Чтобы устранить эту проблему, обнаруженную во время работы локального приложения и удаленной базы данных , используйте SQL Server Configuration Manager для добавления псевдонима для удаленной базы данных.

Подробности

Недавно я столкнулся с этой проблемой при переходе с Windows 7 на ноутбук с Windows 10. Я запускал локальную среду разработки и среды выполнения, обращаясь к нашей базе данных Dev на удаленном сервере. Мы получаем доступ к базе данных Dev через настройку псевдонима сервера с помощью утилиты клиентской сети SQL Server (cliconfg.exe). Убедившись, что псевдоним был правильно настроен как в 64-битной версии 32-разрядной версии утилиты, так и в том, что сервер базы данных был доступен с нового ноутбука через SSMS, я все же получил ошибку, обнаруженную OP (а не IP-адресом OP, курс).

Для добавления псевдонима для удаленного сервера базы данных Dev необходимо было использовать диспетчер конфигурации SQL Server. Исправлены ошибки.

13
задан Shepmaster 7 February 2017 в 17:09
поделиться

2 ответа

Ответ погрешён в сообщении об ошибке:

существует метод clone, но следующие ограничения параметров не выполнялись: T : std::clone::Clone

Когда вы получаете Clone (и многие другие автоматически производные типы), он добавляет Clone привязку к всем родовым типам. Используя rustc -Z unstable-options --pretty=expanded, мы можем видеть, что это делается:

impl <'a, T: ::std::clone::Clone + 'a> ::std::clone::Clone for Foo<'a, T> {
    #[inline]
    fn clone(&self) -> Foo<'a, T> {
        match *self {
            Foo { t: ref __self_0_0 } =>
            Foo{t: ::std::clone::Clone::clone(&(*__self_0_0)),},
        }
    }
}

В этом случае оценка не нужна, потому что общий тип находится за ссылкой.

На данный момент вам нужно будет реализовать Clone самостоятельно. Для этого есть проблема с ржавчиной, но это сравнительно редкий случай с обходным способом.

22
ответ дан Shepmaster 19 August 2018 в 07:32
поделиться

Ваш пример будет выводить Clone без каких-либо проблем, если вы явно отметите, что T должен реализовывать Clone, например:

#[derive(Clone)]
struct Foo<'a, T: 'a> {
    t: &'a T,
}

fn bar<'a, T: Clone>(foo: Foo<'a, T>) {
    foo.clone();
}

( Ссылка на игровое поле )

Кажется необычным, что вы можете явно не указывать привязку, но ответ Shepmaster, похоже, предполагает, что компилятор вставляет его неявно, поэтому мое предложение функционально идентично.

4
ответ дан Aurora0001 19 August 2018 в 07:32
поделиться
  • 1
    Это хорошее решение, но я не согласен с функционально идентичным - в этом случае структура может содержать только T, который реализует Clone, но эта конкретная граница не обязана , чтобы клонировать ссылку. Если программа требует, чтобы T был клонирован по другим причинам, это работает. – Shepmaster 9 September 2016 в 15:55
  • 2
    О, я предположил, что T: ::std::clone::Clone + 'a из вашего примера означает, что T реализована Clone; я не понимаю? – Aurora0001 9 September 2016 в 15:56
  • 3
    @Shepmaster, после некоторого тестирования я обнаружил, что вы можете удалить Clone на T в структуре без проблем, и, делая это, я получаю точно такой же вывод из расширенного довольно принтера, как руководство impl , – Aurora0001 9 September 2016 в 16:14
  • 4
    Нет, это моя вина за то, что я не понимаю. Я имел в виду, что мое "решение" заключается в реализации Clone без его получения. Это позволяет структуре вообще не иметь ограничений. – Shepmaster 9 September 2016 в 16:14
Другие вопросы по тегам:

Похожие вопросы: