我有以下模板類&示例類:如何設置,作爲默認模板參數,嵌套模板類instanciation取決於其他參數
template<typename A, typename B, typename C = typename A::Nested<B>>
struct X
{
X()
{
std::cout << "A is : " << A::who() << std::endl;
std::cout << "B is : " << B::who() << std::endl;
std::cout << "C is : " << C::who() << std::endl;
}
};
struct Bsample
{
static const char* who() { return "Bsample"; }
};
struct Asample
{
template<typename B>
struct Nested;
template<>
struct Nested<Bsample>
{
static const char* who() { return "Asample::Nested<Bsample>"; }
};
static const char* who() { return "Asample"; }
};
當使用VCl 4,以上代碼編譯就好,併產生預期的行爲爲X<Asample, Bsample>
默認模板參數C
到Asample::Nested<Bsample>
的實例。
然而,GCC 5.1編譯時,我得到以下錯誤:
prog.cpp:4:65: error: expected '>' before '<' token
template<typename A, typename B, typename C = typename A::Nested<B>>
^
我試了幾個組合,以申報模板參數C
默認值,使用template
,typename
,...但沒有成功地使用GCC編譯此代碼。
如何使此代碼符合C++標準並使用GCC進行編譯?
感謝您的幫助
編輯:除了從TartanLlama
除了從TartanLlama接受的答案接受的答案,我也只好終止模板參數brakets之間插入空白(空間) :
template<typename A, typename B, typename C = typename A::Nested<B> >
// blank (space) added here^
否則,GCC將發出以下錯誤(未指定選項-std=c++11
時):
error: spurious '>>', use '>' to terminate a template argument list
template<typename A, typename B, typename C = typename A::template Nested<B>>
^
我投票重新開放,因爲這不僅僅是'template'和'typename',它似乎像OP知道他們的使用,但不知道如何在這裏應用它。 – TartanLlama
@TartanLlama:可悲的是,有些人比光明更快地解決問題,甚至沒有把它們讀到最後......(我有一個想法,迄今爲止誰已經關閉了我。)謝謝你重新開放。 – shrike