2011-09-22 42 views
2

Possible Duplicate:
Making a template parameter a friend?如何使一類非可繼承

C++ FAQ 23.11 How can I set up my class so it won't be inherited from? 列出了下面的代碼:

class Fred; 

class FredBase { 
private: 
    friend class Fred; 
    FredBase() { } 
}; 

class Fred : private virtual FredBase { 
public: 
    ... 
}; 

我試圖讓一個相同的通用模板。

#include <stdio.h> 

template<typename MAKE_ME_NONINHERITABLE > 
class NonInheritable{ 
private: 
    NonInheritable(){ 
    } 
    friend MAKE_ME_NONINHERITABLE; //<--- error here 
}; 

這給我一個錯誤:

xxx.cpp:11: error: a class-key must be used when declaring a friend 

所以,我想:

template<typename MAKE_ME_NONINHERITABLE > 
class NonInheritable{ 
private: 
    NonInheritable(){ 
    } 
    friend class MAKE_ME_NONINHERITABLE; //<--- error here 
}; 

class A : virtual public NonInheritable<A>{ 
}; 

而且我得到這個錯誤:

xxx.cpp:11: error: using typedef-name `MAKE_ME_NONINHERITABLE' after `class' 

有沒有一種方法,使這項工作?

+0

這種做法是不實現的,遺憾的是壞消息。 – Jon

+0

您可以使用第一個變體,C++ 11(更改朋友的東西一點),但到目前爲止,似乎支持它的唯一的編譯器GCC是4.7和鐺SVN – PlasmaHH

+0

@PlasmaHH MSVC接受它,以及 – stijn

回答

3

您可以使用從C++ 11 finalsealed微軟擴展C++。