Следующий код успешно компилируется с помощью gcc, но не компилируется в Visual Studio 2013:
#include <memory>
#include <iostream>
using namespace std;
template <typename T>
class MyClass {
public:
MyClass(T* ptr) : m_ptr(ptr) {}
// All of the errors are caused by this conversion operator:
// =========================================================
template <typename U>
operator typename std::shared_ptr<U>() const & {
return m_ptr;
}
//==========================================================
private:
shared_ptr<T> m_ptr;
};
int main(int argc, char* argv[]) {
MyClass<int> c(new int(42));
shared_ptr<int> ptr = c;
cout << *ptr << endl;
}
Я совершенно уверен, что это ошибка в компиляторе VS2013, потому что он компилируется в более новых версиях Visual Studio, но проблема в том, где я работаю, мы застряли с использованием VS2013. Заставить их сменить компилятор не может быть и речи. (Мы должны использовать тот же компилятор, который использует поставщик, поставляющий наше программное обеспечение, и они используют VS2013.)
Ошибки перечислены ниже:
Error 1 error C2143: syntax error : missing ';' before '&'
Error 2 error C2238: unexpected token(s) preceding ';'
Error 3 error C2988: unrecognizable template declaration/definition
Error 4 error C2059: syntax error : '<end Parse>'
Error 5 error C2334: unexpected token(s) preceding ':'; skipping apparent
Error 6 error C1004: unexpected end-of-file found
Мой вопрос, даже с ограничениями VS2013, есть ли какой-либо обходной путь, чтобы этот код скомпилировался и успешно запустился?
operator std::shared_ptr<U>() const &
, так какtypename
не нужен. - person NathanOliver   schedule 01.08.2018&
, но каждая мелочь помогает. - person user4581301   schedule 01.08.2018std::shared_ptr<U>
.const &
- это const и ссылочные характеристики функции. - person NathanOliver   schedule 01.08.2018()
не является частью возвращаемого типа. - person NathanOliver   schedule 01.08.2018operator typename std::shared_ptr<U>() const && { ... }
- person tjwrona1992   schedule 01.08.2018&
в конце функции означает, что только lvalue может вызывать эту функцию. Наличие&&
означает, что только rvalue может вызывать эту функцию. MSVS 2013 поддерживает ссылки на rvalue и семантику перемещения.operator typename std::shared_ptr<U>() const
сделает то, что вы хотите. - person NathanOliver   schedule 01.08.2018std::shared_ptr<int> ptr = std::move(myobject);
Перемещение не приведет к отказу от владения объектом, если вы не реализовали другое преобразование для объектов rvalue, которое явно отказывается от владения. - person tjwrona1992   schedule 01.08.2018