從VC 到GCC移植 談兩者的語法差異

2021-08-26 16:11:21 字數 4041 閱讀 7121

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

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是乙個型別名,而不...