对unique_ptr模板使用typedef

using typedef for unique_ptr template

本文关键字:typedef unique ptr      更新时间:2023-10-16

编译以下代码:

matrix.h before template

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 (using)来缩短的东西,因为我认为它会更可读,但我的改变导致错误。以下是相关的修改。

matrix.h after template

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。默认情况下,返回的局部变量会自动移动。

try this:

template<typename T>
class Matrix
{
public:
    using unique_ptr_type = std::unique_ptr<Matrix>;
    //...
    unique_ptr_type Test() const;
};
template<class T> using MatrixUniq = typename Matrix<T>::unique_ptr_type;
template<typename T>
typename Matrix<T>::unique_ptr_type Matrix<T>::Test() const
{
    return unique_ptr_type(new Matrix());
}

始终确保在将要使用它的代码上方声明模板。

还有这个片段:

template<class T> using MatrixUniq = unique_ptr<Matrix<T>>;
might not be a correct implementation.
Here's how you can declare a type definition in c++.
typedef <type> <var_name>

下面是另一个使用"别名模板"的例子

template<typename T>
using MyVector = std::vector<T, MyCustomAllocator<T>>;

剩下的代码供您调试。

查看此处的相关讨论:

如何定义模板类?