C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 静态模板成员变量具有内部链接但未定义大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
是的,我知道,有一个几乎相同标题的问题,但它指的是一个不同的情况(给出相同的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.

大佬总结

以上是大佬教程为你收集整理的c – 静态模板成员变量具有内部链接但未定义全部内容,希望文章能够帮你解决c – 静态模板成员变量具有内部链接但未定义所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。