gpt4 book ai didi

c++ - 关于基类中的显式模板实例化和静态变量 : compiler bug or valid interpretation of the spec?

转载 作者:太空宇宙 更新时间:2023-11-04 14:21:29 24 4
gpt4 key购买 nike

据我了解(C++ 常识,第 61 项;Solaris Studio C++ 用户指南)模板类的显式实例化将导致其所有成员都被实例化。但是,我发现 Solaris Studio C++ 编译器不是这种情况。由于此编译器的行为通常与其他编译器截然不同,同时仍遵守规范(通常在更严格的意义上),因此我询问任何 C++ 模板专家我所看到的行为是否有效。

我的情况是我有一个模板类“Derived”继承自专门用于“Derived”的模板类“Base”。 “Base ”包含一个静态变量“tracer”,它必须在编译后出现在目标文件中(在我的完整代码中,这与向工厂注册“Derived”有关)。大多数编译器(GCC、Open64、Intel、Clang、Visual C++)都是这种情况。但是,对于 Solaris Studio,只有在“Derived”的构造函数未在其定义中实现时才会发生这种情况。否则,“tracer”不会被放入对象文件中(并且“Derived”不会在工厂中注册)。

下面是一些演示问题的最小代码:

基础.h:

#ifndef BASE_H_
#define BASE_H_
template<typename T>
class Base {
public:
Base() : dummy_(g_tracer_) { }
private:
bool dummy_;
static bool g_tracer_;
};

template<typename T>
bool Base<T>::g_tracer_ = true;
#endif // BASE_H_

DerivedA.cc:

#include "Base.h"
template<typename T>
class DerivedA : private Base<DerivedA<T> > {
public:
DerivedA(int val);
T GetVar() const;
private:
T var_;
};

template<typename T>
DerivedA<T>::DerivedA(const int val) : var_(val) { }

template<typename T>
T DerivedA<T>::GetVar() const { return var_; }

// Explicit Instantiation
template class DerivedA<double>;

DerivedB.cc:

#include "Base.h"
template<typename T>
class DerivedB : private Base<DerivedB<T> > {
public:
DerivedB(int val) : var_(val) { }
T GetVar() const;
private:
T var_;
};

template<typename T>
T DerivedB<T>::GetVar() const { return var_; }

// Explicit Instantiation
template class DerivedB<double>;

如果我用 sunCC -c 编译“.cc”文件并在生成的目标文件上运行 nm,“DerivedA.o”包含一个符号“g_tracer_ “(0000000000000000 V __1cEBase4nIDerivedA4Cd___Jg_tracer__),但“DerivedB.o”没有。 (注意:即使我使用选项 -template=wholeclass,该符号仍然不会出现在输出中。)使用任何其他编译器,两个目标文件都将包含一个对应于“g_tracer_”的符号。

这是有效的行为,还是一个模糊的编译器错误?我对 C++ 规范的了解不足以让我相信这两种方式。 (事实上​​ ,我刚刚在这里看到一个答案表明显式实例化可能不会实例化基类成员,所以现在我特别困惑。)我很感激对此事的任何澄清。谢谢!

最佳答案

嗯,你真的试过建立一个使用实例化类的程序吗?因为你只是在创建一个“库”(这是标准根本没有谈论的东西),我相信编译器(或者更好的是,图书馆员)可以做任何它想做的事。尝试设置一个将所有内容链接在一起的程序。我假设如果没有一些关于未使用符号的实例化的特定链接器配置或一些强制使用的技巧,你最终将根本没有 g_tracers 的实例化 - 链接器根本不会将它们添加到程序中。

干杯,

保罗

关于c++ - 关于基类中的显式模板实例化和静态变量 : compiler bug or valid interpretation of the spec?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7298116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com