c – 静态模板成员变量具有内部链接但未定义
发布时间:2020-12-16 09:51:55 所属栏目:百科 来源:网络整理
导读:是的,我知道,有一个几乎相同标题的问题,但它指的是一个不同的情况(给出相同的clang错误信息).在我的例子中,我有一个带有大匿名命名空间的.cpp文件(包含实现细节).在该命名空间中是一个具有静态数据成员的traits类模板,我需要从匿名命名空间外部访问该模板.让
是的,我知道,有一个几乎相同标题的问题,但它指的是一个不同的情况(给出相同的clang错误信息).在我的例子中,我有一个带有大匿名命名空间的.cpp文件(包含实现细节).在该命名空间中是一个具有静态数据成员的traits类模板,我需要从匿名命名空间外部访问该模板.让我充实一点:
file.hpp namespace bar { template<typename A> struct foo { static_assert(is_same<A,float>::value || is_same<A,double>::value,""); static void set_static_var(A const&x); // ... }; } 和 file.cpp namespace { template<typename A> struct foo_traits { // lots of static code supporting the implementation of bar::foo<> static A datum; }; template<> float foo_traits<float>::datum; // no change if this is in global namespace template<> double foo_traits<double>::datum; template struct foo_traits<float>; template struct foo_traits<double>; } namespace bar { template<typename A> void foo<A>::set_static_var(A const&x) { foo_traits<A>::datum = x; } template struct foo<double>; // error only appears if these lines are present. template struct foo<float>; // but without these lines,the whole file is void. } 并且我在变量foo_traits<> :: datum(以及后来的链接失败)上得到了上述错误.编辑中添加的注释我使用了clang -std = c 11 -stdlib = libc(版本3.3),它只产生了一个警告,但是(正如我所说)在我的实际应用程序中,警告由链接失败备份(确切地说所述符号丢失了).但是,gcc没有编译器警告.也许这是一个铿锵的bug?结束说明 定义这些变量的正确方法是什么?请注意,在anonymouns命名空间之外声明它们将无法编译.还要注意,AFAIK,与普通非模板相同的构造才起作用. 注意我不是在问如何规避这个问题(我能想到自己),但是如何正确地完成这个问题. 解决方法
我认为正确的解决方案很简单:
namespace { template<typename A> struct foo_traits { // lots of static code supporting the implementation of bar::foo<> static A datum; }; template<typename A> A foo_traits<A>::datum; } 你的代码AFAICT的问题在于 float foo_traits<float>::datum; 指的是不存在的foo_traits的特化. (代码中的模板<>也是不允许的,Clang也为它提供了错误). 见this live example. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |