C++ 类模板静态数据成员定义/声明/初始化
我知道这个问题已经被问过好几次了,我一直在读这样的帖子: 然而,我仍然在努力拼凑所有关于模板、专门化、静态数据成员定义和声明的内容 我所拥有的是: 样板 结构A{ 静态std::数组a1; }; 样板 std::数组A::a1{1}; 样板 std::数组A::a1{0.3,0.3}; int main{ std::array v1=A::a1;C++ 类模板静态数据成员定义/声明/初始化,c++,c++11,template-specialization,static-members,C++,C++11,Template Specialization,Static Members,我知道这个问题已经被问过好几次了,我一直在读这样的帖子: 然而,我仍然在努力拼凑所有关于模板、专门化、静态数据成员定义和声明的内容 我所拥有的是: 样板 结构A{ 静态std::数组a1; }; 样板 std::数组A::a1{1}; 样板 std::数组A::a1{0.3,0.3}; int main{ std::array v1=A::a1; std::cout如果专门化整个类,则可以在cpp中省略模板的使用 下面的代码似乎解决了您的目标,它在MSVC x86 V19.14、gcc x86-
std::cout如果专门化整个类,则可以在cpp中省略模板的使用 下面的代码似乎解决了您的目标,它在MSVC x86 V19.14、gcc x86-64 9.2和clang x86-64 9.0.0上编译: 为什么cpp中的定义不需要模板 根据17.7.3[温度说明规范]第5段 显式专用类模板的[…]成员在中定义 与普通类成员的方式相同,并且不使用 模板语法。定义 显式专用成员类。[…]
请注意,这并不是说问题中的代码是错误的,但由于MSVC对此不满意,并且可能是错误的…?解决方法可能是上面建议的代码。如果专门化整个类,则可以在cpp中省略模板的使用 下面的代码似乎解决了您的目标,它在MSVC x86 V19.14、gcc x86-64 9.2和clang x86-64 9.0.0上编译: 为什么cpp中的定义不需要模板 根据17.7.3[温度说明规范]第5段 显式专用类模板的[…]成员在中定义 与普通类成员的方式相同,并且不使用 模板语法。定义 显式专用成员类。[…] 请注意,这并不是说问题中的代码是错误的,但由于MSVC对其不满意,并且可能是错误的…?解决方法可能是上面建议的代码。您找到了。它显然已在Visual Studio 2019版本16.5预览2中修复 作为替代解决方案,您可以将定义保留在标题中,并将其标记为内联: 样板 内联std::数组A::a1{1}; 样板 内联std::数组A::a1{0.3,0.3}; 您点击了。它显然已在VisualStudio2019版本16.5预览2中修复 作为替代解决方案,您可以将定义保留在标题中,并将其标记为内联: 样板 内联std::数组A::a1{1}; 样板 内联std::数组A::a1{0.3,0.3};
谢谢你的工作回答。我觉得很奇怪,必须专门化结构才能准确地告诉模板的用途。你还说专门化版本初始化中的静态成员没有模板化,所以你确实不应该在cpp中使用模板,但如果我把它们拿走,那么gcc和clang会抱怨这是一个错误nswer实际上是错的?是的,谢谢你的回答。我觉得我还是遗漏了一些东西。我认为你在问题中给出的代码是正确的,MSVC将声明视为重新定义是错误的。解决方法可能是我提出的解决方案。谢谢你的工作答案。我觉得奇怪的是,必须有一个特殊的答案调整结构以准确说明模板的用途。另外,您还说,专用版本初始化中的静态成员没有模板化,因此您确实不应该在cpp中使用模板,但如果我将其删除,那么gcc和clang会抱怨此答案实际上是错的?是的,谢谢您的回答。我觉得我是错的仍然缺少一些东西我认为你在问题中给出的代码是正确的,MSVC将声明视为重新定义是错误的。解决方法可能是我提出的解决方案。
template<size_t dim>
struct A {
static std::array<float,dim> a1;
};
template<>
struct A<1U> {
static std::array<float,1U> a1;
};
template<>
struct A<2U> {
static std::array<float,2U> a1;
};
// cpp
std::array<float,1U> A<1U>::a1 {1.f};
std::array<float,2U> A<2U>::a1 {0.3f,0.3f};
int main() {
std::array<float, 1U> v1 = A<1U>::a1;
std::cout << v1[0] << std::endl;
std::array<float, 2U> v2 = A<2U>::a1;
std::cout << v2[0] << " " << v2[1] << std::endl;
return 0;
}