2009-10-14 101 views
1

我試圖實現這個:測試::運營商新

namespace Test 
{ 
    void* operator new(size_t s) 
    { 
     return malloc(s); 
    } 
} 

但G ++(4.3.1)表示:

void* Test::operator new(size_t)’ may not be declared within a namespace 

難道我做錯了什麼?

如果是的話,是否有重載操作符new在我的類中使用?我不想創建一個基類,並讓所有的類都從這樣的基類繼承。

+3

該診斷很奇怪,因爲operator new * can *可以在全局名稱空間中聲明。但只有在那裏:) – 2009-10-14 18:37:27

+0

所以你說,通過語言設計,我可以重載在全局命名空間中的運算符new,對吧? – ebasconp 2009-10-14 18:41:21

+0

通過語言設計,您可以在全局名稱空間和類的成員中聲明'operator new'。 – AnT 2009-10-14 18:50:22

回答

6

您只能(重新)將operator new定義爲全局名稱空間的成員或者(作爲類的隱式靜態)成員。

如果您沒有公共基類,那麼您需要爲每個需要專門實現的類定義operator new。當然,你可以委託一個通用的全球功能。

3

是的,你做錯了什麼。根據該標準的§3.7.3.1/ 1,「分配函數應該是類成員函數或全局函數;如果在全局作用域以外的命名空間作用域中聲明瞭分配函數或聲明瞭分配函數,則該程序是不合格的全球範圍內的靜態「。

這似乎不允許你想要什麼。

0

那麼,編譯器已經告訴過你你做錯了什麼。獨立的'operator new'不能在全局命名空間以外的任何命名空間中聲明。

爲什麼你在地球上決定在'名稱空間測試'中聲明它?你想通過這個實現什麼?

+1

有人可能天真地猜測,ADL適用於new運算符,因此如果在名稱空間Test中定義operator new,則名稱空間Test中的所有類都將使用它。 – 2009-10-14 20:50:30