使用typedef表示unique_ptr模板

时间:2015-08-08 18:44:15

标签: c++ templates

以下代码编译。

模板前的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(using)缩短内容,因为我认为它更具可读性,但我的更改会导致错误。以下是相关更改。

模板后的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>;

3 个答案:

答案 0 :(得分:4)

您在定义之前使用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。默认情况下,返回的局部变量会自动移动。

答案 1 :(得分:3)

试试这个:

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());
}

答案 2 :(得分:1)

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

此片段:

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>>;

其余代码供您调试。

请参阅此处的相关讨论:

How to typedef a template class?