template
<
class
t>
class
foo;
這段**在vc++中一點問題也沒有,但是gcc並不允許,因為它不知道t::sometype是什麼。你需要改為:
template
<
class
t>
class
foo;
通過typename t::sometype告訴gcc,sometype是乙個型別名,而不是其他東西。
當然,這種情況不只是出現在typedef中。例如:
template
<
class
container
>
void
visit(
const
container
&cont)
這裡的container::const_iterator同樣需要改為typename container::const_iterator。
template
<
class
base
>
class
foo :
public
base};
這段**在vc++中同樣沒有問題,但是gcc中不能通過。因為gcc並不知道base_func,m_base_member是什麼。對於這個問題,你可以有兩種改法:
template
<
class
base
>
class
foo :
public
base};
template
<
class
base
>
class
foo :
public
base};
這兩種方法各有好處,在class foo中出現大量的base::base_func、m_base_member的引用時,使用using是方便的。而如果只有一次,那麼方法1顯得簡短。
class
someclass;
template
<
class
t>
class
foo void
foo2()
};class
someclass};
由於vc++對模板函式的遲編譯,因此,乙個模板類不只是可以呼叫乙個尚未出現的類成員函式(或者訪問其成員變數),甚至可以定義其實例。這種語法對c++來說確實顯得怪異。因為等到編譯後面的someclass時,他又可以在其函式中定義class foo的例項,從而出現交叉引用的情況。這在非模板函式的情形下就算你用vc++亦難以做到。
遇到這種情況,該如何移植到gcc中?這個問題有點棘手。我個人認為出現這種情況是不太應該的,這意味著對類與類之間的關係混淆不清。你需要仔細審視一下這兩個類正確的關係是什麼。如果是移植庫(例如wtl就有多處這樣的情形)的過程中遇到這種情況,可以把函式的實現體改為放到類定義體外,如下:
class
someclass;
template
<
class
t>
class
foo;
class
someclass
};template
<
class
t>
inline
void
foo<
t>
::foo(someclass
&a)
template
<
class
t>
inline
void
foo<
t>
::foo2()
以上問題是在將atl/wtl/winx移植到mingw32的時候遇到的,把它寫出來,希望對各位讀者移植自己的**時候有所幫助。
winx at sourceforge
winx at google code
從VC 到GCC移植 談兩者的語法差異
template class t class foo 這段 在vc 中一點問題也沒有,但是gcc並不允許,因為它不知道t sometype是什麼。你需要改為 template class t class foo 通過typename t sometype告訴gcc,sometype是乙個型別名,而不...
從VC 到GCC移植 談兩者的語法差異
template class t class foo 這段 在vc 中一點問題也沒有,但是gcc並不允許,因為它不知道t sometype是什麼。你需要改為 template class t class foo 通過typename t sometype告訴gcc,sometype是乙個型別名,而不...
從VC 到GCC移植 談兩者的語法差異
template class t class foo 這段 在vc 中一點問題也沒有,但是gcc並不允許,因為它不知道t sometype是什麼。你需要改為 template class t class foo 通過typename t sometype告訴gcc,sometype是乙個型別名,而不...