【发布时间】:2014-05-23 02:47:12
【问题描述】:
首先是代码
vector<T> kvec;
for (ulong kv = 0; kv < ke.count; kv++)
{
T key;
if (typeid(T) != typeid(QUAT32))
{
fread(&key, sizeof(T), 1, fh);
}
else{
shortQuat key16;
fread(&key16, sizeof(shortQuat), 1, fh);
key.Parse(key16);
}
kvec.push_back(key);
}
key.Parse(key16); 处抛出以下编译器错误:
error C2039: 'Parse' : is not a member of 'libm2::VEC3F'
当然不是;但问题是任何具有 VEC3F 类型的东西都不应该到达那里。显然,编译器正在使用第一种发送到 sn-p 所在类的类型,这很好 - 但为什么要忽略条件呢?
是的,如果我注释掉那一行,它编译得很好——并且条件在运行时工作得很好。
所以我想真正的问题是,处理这个问题的最佳方法是什么,而不必为一种专门的类型复制整个类?
【问题讨论】:
-
if在运行时运行,而不是在编译时运行。改用模板特化(将代码放在模板函数中,并将该函数特化为QUAT32)。 -
我很害怕——但我不想为了一个小而罕见的情况而复制一大段代码。所以我想出了一个骇人听闻的解决方案。将在下面发布。
-
我不确定我看到重复的来源。只需将
if块和else块中的代码移动到两个函数中(并适当地调用它们)。 -
这是否意味着编译器可以走多远?因为即使我将其分叉到模板函数中,我仍然需要在某个地方进行类型比较。
-
我会在几分钟内提供一些代码。它应该消除任何混乱:-)
标签: c++ visual-studio