【发布时间】:2014-03-24 20:00:53
【问题描述】:
在 C++03 中,我使用 gcc v3.4.6 构建了以下代码,我不明白为什么调用 _setValueSafeFails() 会出现编译器错误,而调用类似的 _incrValueSafe() 则不会。
测试.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?这两者如何区别对待,或者这只是一个编译器错误?
【问题讨论】:
-
(与您的问题无关,但您的变量名不应以_开头,那些是保留符号)
-
我以为是保留的双下划线,但它们在一个类中,所以应该不是问题。
标签: c++ templates language-lawyer volatile