2016-07-15 18 views
0

我已經使用打包的模板類。據this我應該使用#pragma袋包裹在這個例子:如何打包模板課程?

#include <iostream> 

#pragma pack(1) 
template<typename X> 
struct S { 
int a; 
X b; 
}; 
#pragma pack() 

int main() 
{ 
    std::cout << sizeof(S<char>) << "\n"; 
} 

我centOS6,節目輸出8,這意味着包(1)沒有工作使用gcc-4.4.7。然後我試圖將main()更改爲:

int main() 
{ 
    std::cout << sizeof(S<char>) << "\n"; 

#pragma pack(1) 
    std::cout << sizeof(S<char>) << "\n"; 
#pragma pack() 
} 

令人驚訝的是,它仍然無法正常工作。如果我註釋掉main()中的第一行,那麼它就起作用了。所以我的問題是如何在模板類實例化上使用pack?無論如何,在同一個程序中同時使用打包和解包模板類嗎?

更新:如果我使用gcc-5.2.1,那麼它輸出5正確。另外對於下面的程序,我得到相反的結果(5用gcc-4.4.7和8 5.2.1):

template<typename X> 
struct S { 
int a; 
X b; 
}; 

int main() 
{ 
#pragma pack(1) 
std::cout << sizeof(S<char>) << "\n"; 
#pragma pack() 
} 

爲什麼GCC-4.4.7和5.2.1行爲不同?哪一個是正確的?無論如何要用不同版本的gcc獲得一致的結果嗎?

+0

我嘗試用gcc 6.1.1代碼輸出是5. –

回答

1

它爲我

#include <iostream> 
#pragma pack(1) 
namespace Packed 
{ 
    template<typename X> 
    struct S { 
    int a; 
    X b; 
    }; 

    template struct S<char>; 
} 
#pragma pack() 

namespace NotPacked 
{ 
    template<typename X> 
    struct S { 
    int a; 
    X b; 
    }; 

    template struct S<char>; 
} 

int main() 
{ 
    std::cout << sizeof(Packed::S<char>) << "\n"; 
    std::cout << sizeof(NotPacked::S<char>) << "\n"; 
} 

你可以把S的定義頭(但有無#pragma一次),並避免重複代碼:

#pragma pack(1) 
namespace Packed 
{ 
#include "S.h" 
} 
#pragma pack() 

namespace NotPacked 
{ 
#include "S.h" 
} 
+0

不,我得到8和8使用gcc-4.4.7。 – zhao

+0

是的,舊版本需要顯式實例化,我編輯過 – mooncheese