加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读