2013-10-10 53 views
2

我試圖在編譯時用模板找到最大公約數。請看下面的代碼:在編譯時查找最大公約數

#include "stdafx.h" 
#include <iostream> 

template<int N, int M, int K> 
class A{ 
public: 
    static const int a=A<M,K,M%K>::a; 
}; 
template<int N, int M> 
class A<N,M,0>{ 
public: 
    static const int a=M; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::cout << A<11,13,11>::a; 
    return 0; 
} 

此代碼的工作,但如果我試着寫

#include "stdafx.h" 
#include <iostream> 
template<int N, int M> 
class GCD{ 
public: 
    static const int a=A<N,M,N%M>::a; 
}; 
template<int N, int M, int K> 
class A{ 
public: 
    static const int a=A<M,K,M%K>::a; 
}; 
template<int N, int M> 
class A<N,M,0>{ 
public: 
    static const int a=M; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::cout << GCD<11,13>::a; 
    return 0; 
} 

我崩潰錯誤C2059「不變」。

爲什麼這段代碼不起作用?

+4

你的問題是? –

+0

我的問題是爲什麼它沒有工作?爲什麼我會崩潰? –

+0

什麼是確切的錯誤信息,你知道什麼行嗎? – interjay

回答

3

您需要爲A預先聲明頂部:

template<int N, int M, int K> 
class A; 

,然後它工作正常上一個符合標準的編譯器。或者你可以移動GCD低於所有A的東西。

Live example

+0

非常感謝!但是,你能解釋這個錯誤的原因嗎?爲什麼之後這是行得通的。我不明白。 –

+1

@ St.Antario您在'GCD'但是編譯器使用'A',在翻譯的這個階段,只是掃描代碼從上到下不知道什麼'A'是,那麼這是給你一個錯誤。如果向前聲明它,編譯器所需要的最低限度的知識繼續。我在現場示例中提出了一些評論,指出了這一點。 –