2013-04-30 51 views
1

我想創建一個模板類與嵌套命名空間內的朋友功能。如果我刪除所有的命名空間,或者刪除了所有的模板化,它會正常工作。但是兩者都不能編譯。讓我們來看看一些代碼:模板類與嵌套命名空間內的朋友功能

namespace MyNamespace 
{ 
    // Forward declaration 
    template <typename Type> 
    class Container; 

    // Forward declaration 
    namespace AccessPrivateImplementation 
    { 
     template <typename Type> 
     Type getValue(Container<Type>* container); 
    } 

    // Templatized class 
    template <typename Type> 
    class Container 
    { 
     friend Type AccessPrivateImplementation::getValue(Container<Type>* volume); 
    private: 
     Type value; 
    }; 

    // Friend function inside a namespace 
    namespace AccessPrivateImplementation 
    { 
     template <typename Type> 
     Type getValue(Container<Type>* container) 
     { 
      return container->value; 
     } 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    MyNamespace::Container<int> cont; 
    MyNamespace::AccessPrivateImplementation::getValue(&cont); 
    return 0; 
} 

編譯器(VS2010)告訴我:

錯誤C2248: '了myNameSpace ::集裝箱::值':不能訪問類的了myNameSpace聲明私有成員: :容器'

有沒有人有任何想法我失蹤?

+0

儘量宣佈之前''Container' getValue'。 – Pubby 2013-04-30 19:50:01

+0

This thread may help http://stackoverflow.com/questions/16288446/i-need-help-fixing-an-error-message-error-lnk2019-unresolved-external-symbol/16288486#16288486 – 2013-04-30 19:51:02

+0

@Pubby - 謝謝,但getValue需要第二個,因爲它需要一個指向Container的指針。 – 2013-04-30 20:08:13

回答

1

Container類模板內的friend聲明聲明朋友非模板功能getValue()是住在AccessPrivateImplementation命名空間。

但是,您還沒有提供這樣的功能。相反,您在AccessPrivateImplementation名稱空間中擁有的功能是模板,您需要的friendContainer<T>(對於給定的T)的適當專業化。

要做到這一點,你需要的聲明是:

friend Type AccessPrivateImplementation::getValue<>(Container<Type>* volume); 
//            ^^ 

這裏是一個live example,顯示您的代碼與上面的固定編制。

+0

感謝您的解釋和示例代碼,但它並沒有真正解決它在我的情況下(相同的錯誤消息)。該網站似乎使用Clang,所以我想知道它是否可能是VS2010問題?我會盡力解決這個問題...... – 2013-04-30 20:11:19

+0

@DavidWilliams:這可能是VC10的一個問題,是的。 – 2013-04-30 20:18:45

+0

我認爲VS2010在這裏有點棘手。正如我所提到的,如果我刪除命名空間,它將在VS2010上編譯,而且在給出解釋的情況下這是沒有意義的。這個動作對Clang沒有幫助(然後適合你說的)。我想我只需要解決這個問題,但感謝您的幫助。 – 2013-04-30 20:26:22

1

按我的意見,如果你申報friend像這樣將工作:

friend Type AccessPrivateImplementation::getValue<>(Container<Type>* volume); 
               ^^ 
+0

我試過了,它仍然不起作用(同樣的錯誤信息)......但我想相信你,因爲其他答案也是這樣說的。我想知道它是否是VS2010特有的問題,因爲另一個答案提供的代碼似乎在Clang上編譯。 – 2013-04-30 20:09:45

+0

@DavidWilliams我沒有VS2010,但它不會是第一次VS有問題,我會問安迪是否知道 – 2013-04-30 20:11:41