我目前无法像我想的那样设置我的班级成员。我的模板化类只适用于合理的整数类型(无符号和“小”)。每个专业化都需要一个相当大的查找表,只取决于类型。所以我认为它绝对应该是静态的(和const)并且只创建一次。
由于C ++没有静态构造函数,我了解到你可以创建一个在初始化时执行繁重工作的类,并将其作为静态成员。
我将代码缩减为以下基础知识:
// Of this, I only want one instance per type,
// because the table can get big.
template<class T>
struct LookUp
{
static int const SIZE = 1 << (sizeof(T) << 3);
std::vector<T> table;
LookUp()
: table{ SIZE }
{
for (int i = 0; i < SIZE; ++i)
{
// Dummy code
table[i] = i;
}
}
};
// "Normal" template class with common code for all types.
template<class T>
class LbpHelper
{
typedef /*...*/ image;
};
// No functionality for the general case.
template<class T>
class Lbp
{
};
// But for this (among others) we have something.
template<>
class Lbp<uint8_t> : public LbpHelper<uint8_t>
{
typedef uint8_t value_type;
typedef Lbp::image image;
static LookUp<value_type> _lookup; // <-- This is the mean one.
public:
// Stuff...
};
初始化静态成员似乎会让很多用户感到困惑,特别是在模板和专业化方面。我在这里读了很多答案,但没有一个能解决我的问题。
我尝试过像
这样的东西// The type of the class is the same as the type of the member class.
template<> LookUp<uint8_t> Lbp<uint8_t>::_lookup{};
template<> LookUp<uint16_t> Lbp<uint16_t>::_lookup{};
标题或源文件中的或两者。我尝试使用或不使用尖括号中的class T
(当然右侧使用T
),完全省略template<>
,仅使用{}
s来源 - 我不知道还有什么。没有任何效果。
Visual C ++要么告诉我_lookup
不是成员,要么不是可以专门的实体或者这样:错误C2373:&#39; _lookup&#39; :重新定义;不同类型的修饰符。
有人可以告诉我放在哪里以便编辑吗?
答案 0 :(得分:1)
只需删除template<>
位,并将静态数据成员的定义放在.cpp文件中:
LookUp<uint8_t> Lbp<uint8_t>::_lookup{};
LookUp<uint16_t> Lbp<uint16_t>::_lookup{};
...而且,由于_lookup
的类型是一个类,因此您也可以省略{}
;无论如何都会调用它的默认构造函数。如果您使用的是不支持统一初始化的版本,这可能会让VC ++满意。
为什么这是正确的方法:template<>
用于引入显式特化。您不引入明确的专业化 - 您正在定义已定义的显式专业化的数据成员。
这由C ++ 11 14.7.3 / 5涵盖:
...明确专门的类模板的成员是 以与普通类成员相同的方式定义,而不是使用
template<>
语法。相同 在定义显式专用成员类的成员时为true。 ...