修复警告“ Wundefined-var-template”

时间:2019-06-05 14:54:11

标签: c++11 compiler-warnings clang++

搜索重复项当前会给出:

  • This post特别处理了Singleton实现的情况,并且答案与其他实现完全避免了警告。
  • This post会自行解决,而不会解决问题。
  • suggested duplicate解释了如何实现模板成员功能(无关)。
  • 另一个suggested duplicate解释了如何定义模板静态成员(无关)。

据我所知,这些都无法回答在与以下MCVE类似的情况下如何使用clang ++ 3.8+摆脱Wundefined-var-template的问题?


文件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.

Demo

1 个答案:

答案 0 :(得分:1)

按照警告消息的说明进行操作,添加(在a.h中):

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

Demo