我按原样测试了您的代码并得到了相同的结果。 但是,我还单独测试了PI
和ONE_EIGHTY
,它们在输出中给出了正确的结果。 所以我考虑了一下,由于我不知道Visual Studio为什么会这样做,这让我认为它可能是一个错误或者可能留给了编译器实现设计
,但似乎它没有从两个预定义常量的除法中设置const T DEG_RAD
。
要在Visual Studio中解决此问题非常简单,很容易被忽视; 您只需用括号将RHS表达式包装起来即可。
template<typename T>
const T DEG_TO_RAD = (PI<T> / ONE_EIGHT<T>);
这样做将不会打印出正确的值,因为它会在将值分配给左侧const T
变量声明为DEG_TO_RAD
之前进行除法运算。
我不是100%确定,也不要引用我说的话,但从我的理解来看,这可能是运算符优先级顺序的问题。我认为在Visual Studio中,如果没有将RHS包装在括号中,它就无法正确执行除法操作,因此DEG_TO_RAD
被设置为0。
编辑
这是我的完整代码:我正在使用标准库的大约80%来解决我在堆栈上回答问题时遇到的问题,因此我不会列出所有包含项,但我确实拥有大多数容器,I / O,数字,算法,内存,功能,计时器,cmath,GLM等。
在Win 7 - 64位Home Premium上使用Intel Quad Core Extreme的Visual Studio 2017 v15.4.4。
template <typename T>
const T PI = std::acos( static_cast<T>(-1) );
template <typename T>
const T ONE_EIGHTY = 180;
template <typename T>
const T DEG_TO_RAD = PI<T> / ONE_EIGHTY<T>;
int main() {
std::cout << PI<float> << std::endl;
std::cout << ONE_EIGHTY<float> std::endl;
std::cout << DEG_TO_RAD<float> std::endl;
_getch();
return 0;
}
输出:
3.14159
180
0
然后当我这样做时:
template <typename T>
const T PI = std::acos( static_cast<T>(-1) );
template <typename T>
const T ONE_EIGHTY = 180;
template <typename T>
const T DEG_TO_RAD = (PI<T> / ONE_EIGHTY<T>);
int main() {
std::cout << PI<float> << std::endl;
std::cout << ONE_EIGHTY<float> std::endl;
std::cout << DEG_TO_RAD<float> std::endl;
_getch();
return 0;
}
输出:
3.14159
180
0.0174533
我在所有4种模式下尝试了这个:Debug/Release x86和x64,结果都一样。
这可能因为你的机器平台不同而有所不同。
DEG_TO_RAD<float>
之前尝试使用cout << PI<T> << endl
,你会得到正确的结果。 - Algirdas Preidžiusstd::cout << (float)DEG_TO_RAD<float>
是可以工作的。 - lakeweb