在C++ 03中,我使用gcc v3.4.6構建了以下代碼,但我不明白爲什麼調用_setValueSafeFails()
時出現編譯器錯誤,因爲調用類似_incrValueSafe()
的代碼不會。爲什麼volatile模板參數在一種情況下需要volatile,而不是其他情況?
Test.h:
class Test
{
public:
void test();
template<typename T> void _incrValueSafe(T &value) {
++value;
}
template<typename T> void _setValueSafeFails(T &value, const T setVal) {
value = setVal;
}
template<typename T> void _setValueSafeWorks(volatile T &value, const T setVal) {
value = setVal;
}
volatile bool _testValue;
};
Test.cpp的:
#include "Test.h"
void Test::test() {
_incrValueSafe(_testValue);
_setValueSafeFails(_testValue, true);
_setValueSafeWorks(_testValue, true);
}
Test.cpp: In member function `void Test::test()':
Test.cpp:5: error: no matching function for call to `Test::_setValueSafeFails(volatile bool&, bool)'
不應該_incrValueSafe()
得到同樣的錯誤,因爲在它的簽名沒有volatile
要麼?這兩者如何對待不同,還是隻是一個編譯器錯誤?
(已無關,與你的問題,但是,這些被保留的符號,你不應該_帶領你的變量名) – IdeaHat
我以爲是被保留雙下劃線,但這些都是內上課,所以不應該是一個問題。 – WilliamKF