我正在使用多线程编程模板矩阵。 我需要我的矩阵才能使用这个代码行(我无法更改,这是我的程序的需求):
Matrix<Complex>::setParallel(false);
所以对于这个并行(这是bool决定是否使用多线程)必须是静态的。
所以一开始我就这样定义:
template<class T>
class Matrix
{
private:
...
public:
static bool parallel;
...
};
然后我收到了这个错误:
... undefined reference to 'Matrix<int>::parallel'
快速搜索后,我在堆栈溢出中得到了这个问题:Undefined reference to a static member
所以我继续说下答案。 所以我把我的代码改为:
template<class T>
class Matrix
{
private:
...
public:
static bool Matrix::paraller;
...
};
现在我收到了这个错误:
extra qualification 'Matrix<T>::' on member 'paraller' [-fpermissive]
(注意:我也试过静态&#34; bool Matrix :: paraller;&#34;相反,没有帮助。
现在我不知道如何摆脱额外的资格错误,而无需再次取回未定义的引用。
如果重要的话,整个代码都在一个名为:&#34; Matrix.hpp&#34;的文件中,我无法更改(我项目的另一个要求)。
我该怎么办?
答案 0 :(得分:1)
此代码段
中最佳描述了正确的静态类成员用法struct A
{
static bool concurrent;
};
A::concurrent = false;
或者,如果该成员是const
struct B
{
static const bool concurrent = false;
};
指定模板静态类成员完全相同。有一件事情出现了:静态成员初始化必须在声明范围内可用。这意味着,无法将声明与实现分离 - 它们必须在同一程序单元中完全。然而,这是每个模板单元的共同要求,无论是对象,函数等等。
因此,以这种方式创建非const模板静态类成员
template <typename T, typename U, typename... Rest>
struct TemplateStruct
{
static U variable;
}
template <typename T, typename U, typename... Rest>
TemplateStruct<T, U, Rest...>::variable = U();
U
可以是您想要的任何类型,而default constructor
则为ng-click="successAdded = false"
。