Oracle Solaris Studio 12.2 发行版的新增功能

不支持引用模板中的非全局名称空间目标

如果您使用 -instances=extern 编译,则使用模板和静态对象的程序会出现未定义符号的链接时错误。使用缺省设置 -instances=global 则不会出现问题。编译器不支持对模板中的非全局名称空间作用域目标的引用。请看以下示例:


      static int k;
      template<class T> class C {
              T foo(T t) { ... k ... }
      };

在本示例中,一个模板类的成员引用了静态名称空间作用域的变量。请记住,名称空间作用域包含文件作用域。编译器不支持模板类的成员引用静态名称空间作用域的变量。另外,如果模板在其他的编译单元实例化,那么每个实例都会指向不同的 k,这破坏了 C++ 一次定义规则,代码的行为将会不可预测。

下面的方法也是可行的,但这取决于您如何使用 k,以及它应有的功能。第二个选项仅可供属于类成员的函数模板使用。

  1. 可以为变量提供外部链接属性:


                  int k; // not static 

    所有的实例都使用同一个 k

  2. 也可以使这个变量成为类的静态成员:


                template<class T> class C {
                        static int k;
                        T foo(T t) { ... k ... }
                };	

    静态类成员具有外部链接属性。每个 C<T>::foo 的实例都使用不同的 k。而 C<T>::k 的一个实例可以被其他函数共享。此选项可能是您需要的选项。