템플릿 함수 (이 경우 정적 메서드로 클래스에 있음)를 만들려고하는데 템플릿을 호출 할 수 없습니다. 내가 만든 사양. 즉, 내가 만든 템플릿 스펙을 코드가 호출 할 것으로 예상했으나 그렇지 않습니다.가변 변수가있는 템플릿 함수 - 템플릿 특수화를 호출 할 수 없습니다.
class Atomic {
public:
template <typename T>
static T testAndSet(volatile T &t, T value)
{
ASSERT(false, "Unsupported type");
return T();
};
template <long>
static long testAndSet(volatile long &t, long value)
{
#if defined(_PC)
return InterlockedExchange(&t, value);
#else
return __sync_lock_test_and_set(&t, value);
#endif
};
};
국가 번호 :
volatile long counter = 0;
long newValue = 4;
Atomic::testAndSet(counter, newValue);
호출 스택을 보여줍니다!
SAMPLE.EXE 원자 :: 검사와 지정 (휘발성 긴 & t = 0, long 값 = 4)
나는 또한이 방법을 시도했지만 작동하지 않았다.
template <typename T, typename TT>
static TT testAndSet(T &t, TT value) { ... }
template <volatile long, long>
static long testAndSet(volatile long &t, long value) { ... }
또는
template <typename T, typename TT>
static TT testAndSet(T t, TT value) { ... }
template <volatile long &, long>
static long testAndSet(volatile long &t, long value) { ... }
똑같은
는 ... 그래서 지금은 시도하고 대신 happenning이나 짐승이 그것으로 내 방식을 강요 무슨 이해해야한다. 그때까지는 Lavavej의 핵심 C++ 비디오를 시청할 것입니다. =)
네 말이 맞아! 나는 처음에는이 방법을 사용했으나 GCC 용으로 컴파일하려고 시도했을 때 수정되었다. (어떤 경우 든 다른 질문이다. 그래서 여기에 물어 보지 않을 것이다. (이름 공간이 아닌 scope 클래스 Atomic의 명시적인 전문화와 관련이있다). 전문화 때문에 여러 유형을 전문으로하고 싶었지만 모두 (연동은 OS에 따라 다른 유형을 지원합니다.) 오버로드로 전환하는 것을 고려해 볼 것입니다. Tks 많이! – MasterPlanMan