c++11 - 修复警告 "Wundefined-var-template"

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

当前搜索重复项会给出:

  • This post它专门处理单例实现的情况,并且其中的答案通过不同的实现完全避免了警告。
  • 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

最佳答案

按照警告消息解释,添加(在a.h中):

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

Demo

关于c++11 - 修复警告 "Wundefined-var-template",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56463004/

相关文章:

c++ - 模板和访问者模式

c++ - 在 Release模式下避免 'control reaches end of non-void function' 警告的最佳方法

c - 宏名称的有效字符是什么?

c++ - 模板化转换运算符类型推导在 clang 和 gcc 中不同

c++ - 从 unique_ptr<T> 的 void* 转换为 T** 是如何工作的?

android - 是否可以在 gcc 编译器中使用 clang std 库?

c++ - 根据另一个 vector 对点 vector 进行排序

c++ - clang++ 8.0.1 自分配重载警告

c++ - 无序映射初始化失败

c++ - Clang++ 编译器 - python 的模拟