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