gpt4 book ai didi

c++ - Clang 和 Gcc 不同意实例化后的显式特化

转载 作者:行者123 更新时间:2023-11-30 03:16:24 24 4
gpt4 key购买 nike

在我审查的一些代码中,我遇到了 Clang 和 Gcc 不同意的情况。环顾四周后,我似乎无法弄清楚谁是对的。

免责声明:我知道有更好的单例模式,但这是代码中使用的模式。

注意事项:

  • Ubuntu 上的 gcc 7.4.0(无错误)

  • Ubuntu 上的 clang 6.0.0(抛出错误)

  • C++11 之后的所有 ISO 版本似乎都存在差异,但我之前没有尝试过。

foo.hh

#include "sing.hh"

class Foo {
public:
Foo();
~Foo();
static Foo *getSingleton(){
return singleton<Foo>::instance();
}
};

foo.cc

include "foo.hh"
//removing this line results in the error for clang disappearing
template<> singleton<Foo>::GetInstance singleton<Foo>::instance = nullptr;
int main(){};

唱.hh

template<typename T>
class singleton{
typedef T *(*GetInstance)(void);
public:

static GetInstance instance;

};

结果:

$ clang++  foo.cc
foo.cc:3:56: error: explicit specialization of 'instance' after instantiation
template<> singleton<Foo>::GetInstance singleton<Foo>::instance = nullptr;
^
./foo.hh:10:32: note: implicit instantiation first required here
return singleton<Foo>::instance();
^
1 error generated.



$ g++ foo.cc <- No Errors

最佳答案

这两个编译器在技术上都没有错。代码无效,但不需要 C++ 实现来提供有关此类错误的诊断消息。

标准[temp.expl.spec]/6说(强调我的):

If a template, a member template or a member of a class template is explicitly specialized then that specialization shall be declared before the first use of that specialization that would cause an implicit instantiation to take place, in every translation unit in which such a use occurs; no diagnostic is required.

您可以通过在 sing.hh 中定义 singleton 之后立即声明显式特化来解决此问题:

struct Foo;
template<> singleton<Foo>::GetInstance singleton<Foo>::instance;

或者,如果您希望所有特化都初始化为空指针,您可以只定义通用类模板的成员,同样可能在 sing.hh 中。这样就不需要显式特化,除非您想要对某些特定类型使用不同的初始化程序。

template<typename T>
typename singleton<T>::GetInstance singleton<T>::instance = nullptr;

关于c++ - Clang 和 Gcc 不同意实例化后的显式特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56351128/

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