Исправление предупреждения "Wundefined-var-template" - PullRequest
0 голосов
/ 05 июня 2019

Поиск дубликатов в настоящее время дает:

  • Этот пост , в котором конкретно рассматривается случай реализации Singleton, и в котором ответы избегают предупреждения вместе с другой реализацией.
  • Этот пост , который отвечает сам, не решая проблему.
  • A предложил дубликат , который объясняет, как реализовать функции-члены шаблона (не имеет значения).
  • Другой предложил дубликат , объясняющий, как определять статические элементы шаблона (не имеет значения).

Насколько я понимаю, ни один из этих ответов не отвечает на вопрос как избавиться от Wundefined-var-template с помощью clang ++ 3.8+ в ситуации, аналогичной MCVE ниже?


Файл a.h

#ifndef A_INCLUDED
#define A_INCLUDED

    template <class T>
    struct A
    {
        static const char *name;
    };

#endif

Файл a.cpp

#include "a.h"

template <> const char* A<double>::name = "Johnny";
template <> const char* A<float>::name = "Dude";

Файл b.cpp

#include <cstdio>
#include "a.h"

void say_it() {
    printf( "%s\n", A<double>::name );
}

Запуск с терминала:

$ clang++ -c -o a.o -std=c++11 a.cpp
$ clang++ -c -o b.o -std=c++11 b.cpp a.o
clang: warning: a.o: 'linker' input unused [-Wunused-command-line-argument]
b.cpp:5:32: warning: instantiation of variable 'A<double>::name' required here, but no definition is available [-Wundefined-var-template]
    printf( "%s\n", A<double>::name );
                               ^
./a.h:7:28: note: forward declaration of template entity is here
        static const char *name;
                           ^
b.cpp:5:32: note: add an explicit instantiation declaration to suppress this warning if 'A<double>::name' is explicitly instantiated in another translation unit
    printf( "%s\n", A<double>::name );
                               ^
1 warning generated.

Демонстрация

1 Ответ

1 голос
/ 05 июня 2019

Сделайте как объяснение предупреждающее сообщение, добавьте (в ах):

template <> const char* A<double>::name;

Демо

...