cpp文件中的C ++值定义和额外限定

时间:2015-11-16 10:05:07

标签: c++ matrix static-members undefined-reference

我正在使用多线程编程模板矩阵。 我需要我的矩阵才能使用这个代码行(我无法更改,这是我的程序的需求):

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;的文件中,我无法更改(我项目的另一个要求)。

我该怎么办?

1 个答案:

答案 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"