【发布时间】:2012-10-12 13:10:53
【问题描述】:
我不得不从 g++-4.6 切换到 4.7(所以我可以使用一些 C++11 功能)。现在,编译器抱怨:
In function WordJIT<float>::WordJIT(): undefined reference to JitRegType<float>::Val_t
我想知道这些编译器版本之间是否发生了一些可能影响符号解析的变化。还是新版本(4.7)中实现的语言更好,我做错了:(相同的代码用4.6编译)
jit.h
class Jit {
public:
enum RegType { f32=0,f64=1,u16=2,u32=3,u64=4,s16=5,s32=6,s64=7 };
// ...
};
template <class T> struct JitRegType {};
template <> struct JitRegType<float> { static const Jit::RegType Val_t = Jit::f32; };
wordjit.h
#include "jit.h"
template<class T>
class WordJIT
{
WordJIT() {
mapReg.insert( std::make_pair( JitRegType<T>::Val_t , jit.getRegs( JitRegType<T>::Val_t , 1 ) ) );
}
private:
typedef std::map< Jit::RegType , int > MapRegType;
mutable MapRegType mapReg;
};
编辑:
static const 可以在头文件中使用还是应该使用constexpr?
有没有办法在 JitRegType 的类声明中也声明 Val_t 但实际上没有定义它?
【问题讨论】:
-
reg中的reg( JitRegType<T>::Val_t );是什么? -
@PiotrNycz 我用它代替了占位符,以免过多地破坏示例。但是,见上文
-
您在切换到 gcc 4.7 但停留在 C++03 时是否收到错误,或者您是否还启用了 C++11?因为如果您选择相同的 C++ 标准版本,名称解析在两个版本中的实现应该完全相同,因为它们应该根据标准实现它。
-
-std=c++0x在 4.6 和 4.7 中均启用。我在代码的其他部分通常需要 C++11 功能。现在我正在使用构造函数委托 - 切换到 4.7 的原因 -
肮脏的解决方法:让
reg(...)接受一个int 而不是RegType,或者强制转换它。但是,如果有人知道这在 4.6 中起作用而在 4.7 中不起作用的原因会更好......
标签: c++ static c++11 constants