2012-12-22 95 views
4

當我編寫C++代碼時,我嘗試使用using <X>防止污染太多。在Crypto ++中,它在一種情況下給我帶來問題。這種情況是CryptoPP命名空間中的ASN1命名空間(它只顯示在一個地方)。使用嵌套命名空間聲明「using namespace」時出錯(「namespace xxx :: yyy不允許在使用聲明中」)

以下是Crypto ++中的聲明:http://www.cryptopp.com/docs/ref/oids_8h_source.html

我可以使用,例如,secp256r1曲線有:

CryptoPP::ASN1::secp256r1(); 

不過,我還沒有想出一個辦法使用聲明它。當我嘗試:

#include <cryptopp/asn.h> 
#include <cryptopp/oids.h> 
using CryptoPP::ASN1; 

這最終導致error: namespace ‘CryptoPP::ASN1’ not allowed in using-declaration,然後error: ‘ASN1’ has not been declared在下面的(我想他們倆):

ECIES<ECP>::Decryptor d1(prng, secp256r1()); 
ECIES<ECP>::Decryptor d2(prng, ASN1::secp256r1()); 

一個人如何使用using語句時,有不止一個命名空間?


$ g++ -version 
i686-apple-darwin11-llvm-g++-4.2 
+1

'使用命名空間CryptoPP :: ASN1;' –

回答

12

只是說:

using namespace CryptoPP::ASN1; 
+0

謝謝@Charles。這導致'ASN1 :: secp256r1()'錯誤:'ASN1'未被聲明。 – jww

+3

直接調用'secp256r1()'而不使用命名空間限定符 –

4

ASN1是一個命名空間。嘗試:

using namespace CryptoPP::ASN1; 
+0

謝謝@Silpertan。這導致'ASN1 :: secp256r1()'錯誤:'ASN1'未被聲明。 – jww

2

嘗試

using CryptoPP::ASN1::secp256r1; 

...然後調用secp256r沒有資格。這避免了使用名字空間,有些皺眉頭。

1

其他的答案建議更換using namespace CryptoPP::ASN1;但是這不是你想要的(大概),因爲它進口所有的的ASN1命名空間的內容到你的範圍。

我的猜測是你要做到這一點:

namespace ASN1 = CryptoPP::ASN1; 

這將讓你在你的範圍內使用,例如ASN1::secp256r1()

相關問題