以下代码编译。
模板前的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>;
答案 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>>;
其余代码供您调试。
请参阅此处的相关讨论: