gpt4 book ai didi

c++ - 将 typedef 用于 unique_ptr 模板

转载 作者:太空狗 更新时间:2023-10-29 23:50:20 26 4
gpt4 key购买 nike

编译以下代码。

模板前的matrix.h

template<typename T>
class Matrix
{
public:
//...
unique_ptr<Matrix<T>> Test() const;
};

模板前的matrix.cpp

template<typename T>
unique_ptr<Matrix<T>> Matrix<T>::Test() const
{
unique_ptr<Matrix<T>> a{ new Matrix<T>{ 1, 1 } };
return std::move(a);
}

我想使用 typedef(使用)来缩短内容,因为我认为它更具可读性,但我的更改会导致错误。以下是相关更改。

模板后的matrix.h

template<typename T>
class Matrix
{
public:
//...
MatrixUniq<T> Test() const;
};

template<class T> using MatrixUniq = unique_ptr<Matrix<T>>;

模板后的matrix.cpp

template<typename T>
MatrixUniq<T> Matrix<T>::Test() const
{
MatrixUniq<T> a{ new Matrix<T>{ 1, 1 } };
return std::move(a);
}

进行这些更改后编译会使 VC++ 编译器崩溃两次,但还会产生一些错误:

Error   C2143   syntax error: missing ';' before '<'    
Error C4430 missing type specifier - int assumed.
Error C2238 unexpected token(s) preceding ';'
Error C1903 unable to recover from previous error(s);

我的 typedef 实现有什么问题?谢谢。

编辑:我正在使用 VS2015。我正在构建一个静态库。在 matrix.cpp 的底部我有:

template class VMatrix<double>;

最佳答案

您正在使用 MatrixUniq<T>在定义之前别名。

移动using类内:

template<typename T>
class Matrix
{
public:
template<class U> using MatrixUniq = std::unique_ptr<Matrix<U>>;

MatrixUniq<T> Test() const;
};

并相应地更改定义:

template<typename T>
Matrix<T>::MatrixUniq<T> Matrix<T>::Test() const
{
return MatrixUniq<T>{ new Matrix<T>{ 1, 1 } };
}

或者如果你想把它放在全局命名空间中,在类的前向声明之后的类定义之前定义它:

template<typename T>
class Matrix;

template<class T> using MatrixUniq = std::unique_ptr<Matrix<T>>;

template<typename T>
class Matrix
{
public:
//...
MatrixUniq<T> Test() const;
};

此外,您不需要显式执行 std::move返回局部变量时。默认情况下,返回的局部变量会自动移动。

关于c++ - 将 typedef 用于 unique_ptr 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31897333/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com