我们试图使用模板定义一个类:
template<typename _VType, size_t _Len>
class Obc<_VType,_Len> {
private:
size_t len = _len;
public:
Obc();
Obc(_VType *values);
...
};
并且,我们希望能够像:
一样使用它Obc<_DType, 2> m = new Obc();
然而,&#34;'Matrix'不是一个类模板&#34;编译时。
我们通过搜索&#39;而不是类似模板&#39;找到了解决方案,如'X is not a template' error,但没有运气
有什么想法吗?
答案 0 :(得分:7)
不要重复模板参数:
template<typename _VType, size_t _Len>
class Obc {
...
};
假设_DType
是现有类型,请使用包含模板参数的模板类,而不使用java语法,例如:
Obc<_DType, 2> m;
Obc<_DType, 2> mat{values}; // assuming _DType *values point to something
auto othermat = mat;
答案 1 :(得分:0)
我们试图使用模板定义一个类:
template<typename _VType, size_t _Len> class Obc<_VType,_Len> { private: size_t len = _Len; public: Obc(); Obc(_VType *values); ... }; and, we expected to be able to use it like:
使用中的编译器认为Obc是一种特殊化,它不是,因此错误是“X不是模板”:
下面的例子更清楚地解释了它(见评论):
template <typename VType, size_t Len>
class Obc { //Non-specialized
private:
size_t len = Len;
public:
Obc(){}
Obc(VType *values){}
};
template<typename VType>
class Obc<VType,5> { //Partially specialized for size_t = 5
//... expects non-specialized declaration
private:
size_t len = 5;
public:
Obc(){}
Obc(VType *values){}
};
class X{};
int main() {
// Using new like this... bad style... leak...
auto m = new Obc<X, 5>(); //Instantiates specialization
auto n = new Obc<X, sizeof(X)>(); //Instantiates original
// your code goes here
return 0;
}
BTW,使用new来创建Obc意味着它是在堆上创建的,这是(1)并不总是必要的,并且(2),当完成时,应该被解除分配。在这种情况下,它应该包含某种smart_ptr,例如unique_ptr或shared_ptr,具体取决于所有权语义:
相反(在上面的例子中):
...
Obc<X, 5> m{}; //Instantiates specialization
//or
auto ptr = std::make_shared<Obc<X,5>>();
//...Or some other smart pointer type
...