【发布时间】:2015-01-23 15:47:46
【问题描述】:
以下代码
#include <vector>
#include <complex>
#include <algorithm>
template<class K>
inline void conjVec(int m, K* const in) {
static_assert(std::is_same<K, double>::value || std::is_same<K, std::complex<double>>::value, "");
if(!std::is_same<typename std::remove_pointer<K>::type, double>::value)
#ifndef OK
std::for_each(in, in + m, [](K& z) { z = std::conj(z); });
#else
std::for_each(reinterpret_cast<std::complex<double>*>(in), reinterpret_cast<std::complex<double>*>(in) + m, [](std::complex<double>& z) { z = std::conj(z); });
#endif
}
int main(int argc, char* argv[]) {
std::vector<double> nums;
nums.emplace_back(1.0);
conjVec(nums.size(), nums.data());
return 0;
}
在 Linux 上编译良好p>
- Debian clang 版本 3.5.0-9
- gcc 版本 4.9.1
- icpc 版本 15.0.1
在 Mac OS X 上
- gcc 版本 4.9.2
但没有
- clang-600.0.56
- icpc 版本 15.0.1
除非定义了宏 OK。我不知道哪些是错误的编译器,有人可以告诉我吗?谢谢。
PS:这里是错误
10:48: error: assigning to 'double' from incompatible type 'complex<double>'
std::for_each(in, in + m, [](K& z) { z = std::conj(z); });
【问题讨论】:
-
能把得到的编译错误加进去吗?
-
我已经更新了我的第一篇文章以包含错误。我不明白为什么会出现这样的错误,因为对我来说,可以在语法分析期间评估测试第 8 行,因此编译器应该知道只有在
K = std::complex<double>时才评估第 10 行,不是吗?跨度> -
整个函数还是要编译的。您正在尝试使用
if作为(不存在的)static if。只需编写两个重载。 (remove_pointer也没有意义。double和complex<double>都不是指针。) -
对不必要的
remove_pointer感到抱歉。为什么建议使用两个重载,如果我定义宏OK,代码在所有平台上编译和运行double和complex<double>都很好,我猜这个实现的运行时成本不会高很多比有两个重载的? -
因为它更容易阅读,而且实际上更短。
标签: c++11 g++ complex-numbers clang++ icc