В каком-то коде, который я рассматриваю, я столкнулся с случаем, когда Clang и Gcc не согласны. Посмотрев вокруг некоторое время, я не могу понять, кто прав.
Отказ от ответственности : я знаю, что есть лучший шаблон синглтона, но это тот, который используется в коде.
Примечания:
gcc 7.4.0 в Ubuntu (без ошибок)
clang 6.0.0 в Ubuntu (выдает ошибку)
Разница, кажется, существует для всех версий ISO после C ++ 11, но я не пробовал ранее.
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(){};
sing.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