C++ 在C+中非平凡地初始化模板类的静态成员+;11没有叮当的警告

C++ 在C+中非平凡地初始化模板类的静态成员+;11没有叮当的警告,c++,c++11,templates,clang,C++,C++11,Templates,Clang,我有一个模板类,其结构如下: foobar.h: class Bar { Bar(float f); }; template<typename T> class Foo { Foo(const Bar&); ... static const Foo mkFooConst; }; typedef Foo<float> MathFoo; 类栏 { 棒(浮球f); }; 模板 福班 { Foo(const-Bar&); ... 静态

我有一个模板类,其结构如下:

foobar.h:

class Bar
{
    Bar(float f);
};

template<typename T>
class Foo
{
    Foo(const Bar&);
    ...
    static const Foo mkFooConst;
};

typedef Foo<float> MathFoo;
类栏
{
棒(浮球f);
};
模板
福班
{
Foo(const-Bar&);
...
静态常数Foo mkfoocont;
};
类型def Foo MathFoo;
foobar.c:

template<> const MathFoo MathFoo::mkFooConst(Bar(0.815));
模板常量MathFoo MathFoo::mkfoocont(Bar(0.815));
现在,这似乎是通常推荐的初始化模板类的静态成员的方法,该模板类不能在其声明中简单地初始化。VS 2015和g++似乎都能很好地工作

但是,clang不同意,并在最终使用该类时发出警告:

warning: instantiation of variable 'Foo<float>::mkFooConst' required
here, but no definition is available [-Wundefined-var-template]
...
note: add an explicit instantiation declaration to suppress this
warning if 'Foo<float>::mkFooConst' is explicitly instantiated in
another translation unit.
警告:需要实例化变量'Foo::mkfoocont'
此处,但没有可用的定义[-Wundefined var template]
...
注意:添加显式实例化声明以禁止此操作
如果在中显式实例化了“Foo::mkfoocont”,则发出警告
另一个翻译单位。
我的理解是,这意味着我应该向头文件添加以下代码:

extern template class MathFoo<float>;
extern模板类MathFoo;
cpp文件可能包含以下内容:

template class MathFoo<float>;
模板类MathFoo;
但无论我把它放在哪里,这给我的都是一个彻底的错误,而不是警告——“实例化后显式专门化”或“实例化后显式专门化”“专门化后显式实例化”

我还尝试只为成员添加一个显式实例化声明,但这也不起作用

有什么想法吗

不幸的是,C++17不是我的选择;代码必须与C++11兼容。

您必须输入:

template<> const MathFoo MathFoo::mkFooConst;
// Declaration only, mkFooConst{} would be a definition.
模板常量MathFoo MathFoo::mkfoocont;
//仅声明,mkfoocont{}将是一个定义。


@箭鱼:我一点也不觉得这是复制品。此处的OP使用的是该问题的技术解决方案之一。由于所希望的dupe没有被重新打开,因此将重新打开。您是否必须支持除
float
之外的其他模板类型参数,这些参数的值可能不同?因为如果不是,那么作为一个实际的解决方法,您可以在标题中提供一个模板化的通用定义。不过,这仍然留下了一个尖锐的问题。我无法重现这个问题。请编辑您的问题并添加“实例化后显式专门化”或“实例化后显式专门化”这两个选项相同。也许你无意中粘贴了两次相同的答案?我还没有机会测试这个答案(我的工作方式不同),但我想这是有道理的。