gpt4 book ai didi

c++ - 还使用 'extern template class' 语法时模板类静态成员变量的特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:27 27 4
gpt4 key购买 nike

我有一个模板类,我只打算将它与我提前知道的 3 种不同类型一起使用。为了减少代码膨胀,我想尽可能多地保留在 header 之外。模板类还具有静态变量,这些变量必须根据特化而不同。

我尝试在使用 Visual C++ 19.15.26729 的 Windows 和使用 XCode 和 clang-900.0.39.2 的 Mac 上实现这一点。我需要不同的代码来满足每个编译器的要求,更糟糕的是,编译器会提示彼此的“好”程序版本。

这是一个最小的例子:

// A.h
template<typename T>
class A
{
public:
static T x;
};

// template<> int A<int>::x; // PROBLEMATIC PART

extern template class A<int>;
// A.cpp
#include "A.h"

template<> int A<int>::x = 42;

template class A<int>;
// main.cpp
#include "A.h"

int main()
{
return A<int>::x;
}

上面的代码(带有注释的行)在 VC++ 上编译得很好,但是 clang 报错: Explicit specialization of 'x' after instantiation

这个问题的答案很有帮助:What's the right way to specialize a template when using "extern template"?

template<> int A<int>::x;取消注释它在 Xcode 上编译得很好,但随后 Visual C++ 提示:

1>A.cpp(3): error C2086: 'T A<int>::x': redefinition
1> with
1> [
1> T=int
1> ]
1>A.h(9): note: see declaration of 'x'
1>A.cpp(3): error C2086: 'T A<T>::x': redefinition
1> with
1> [
1> T=int
1> ]
1>A.h(6): note: see declaration of 'A<int>::x'

我的方法从根本上是错误的吗?这是编译器错误吗?也许这是只有一个编译器支持的功能,如果是的话 - 根据标准哪个版本是正确的?

最佳答案

这确实是 Microsoft 编译器中的一个错误,已经记录在他们的积压中。请关注此问题以获取更新:https://developercommunity.visualstudio.com/content/problem/319447/explicit-specialization-of-static-data-member-inco.html

关于c++ - 还使用 'extern template class' 语法时模板类静态成员变量的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54483114/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com