2013-11-15 61 views
2
#include <cstddef> 
#include <iostream> 

template<std::size_t R, std::size_t C> 
struct foo {}; 

template<std::size_t R, std::size_t C> 
class bar { 
public: 
    bar(const foo<R, C>& = foo<R, C>()) {} 
}; 

int main() { 
    bar<10, 10> y; 
    std::cout << 'x'; 
} 

上述代碼compiles and runs correctly(打印x作爲輸出)對於g ++ V4.8,而同樣does not even compile上鐺++ V3.4,聲稱一個error: unknown type name 'C'。爲什麼兩個版本的編譯結果不同?爲什麼不用鏗鏘聲++編譯與g ++相同的文件?

用於編譯的命令有:

g++-4.8 -std=c++11 -O2 -Wall -pedantic -pthread main.cpp && ./a.out 
clang++ -std=c++11 -O2 -Wall -pedantic -pthread main.cpp && ./a.out 
+2

至少應該在其中定義'std :: size_t'的頭部包含。 – juanchopanza

+0

@ juanchopanza,絕對正確,固定。 (當然的問題仍然存在) – Shoe

+1

看起來像編譯器故障 – uk4321

回答

2

這是在標準中的缺陷,如http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#325處理。

問題是,在類中默認參數的名稱查找應考慮所有類成員(包括稍後聲明的類成員),但是當默認參數爲T<X, Y>時,我們只知道默認參數是什麼,一旦我們完全解析該類(默認參數可以是T<X, Y>或可以是T<X,如果T不是類的完整範圍中的模板,那麼逗號將終止默認參數)。

在解決這個問題時,GCC和Clang顯然採取了不同的方法。您可以簡單地修改您的代碼,方法是將默認參數括起來。

相關問題