gpt4 book ai didi

c++ - 与模板类 : Compile error 成为 friend

转载 作者:太空狗 更新时间:2023-10-29 23:42:00 27 4
gpt4 key购买 nike

我正在尝试使用 Pointer to Implementation Idiom 来隐藏我正在使用 Concurrency::unbounded_buffer(来自 VC++ 2010)的事实。问题是,我正在使用模板进行操作,但遇到了编译错误。这是代码:

阻塞队列.h

#pragma once

namespace DRA{
namespace CommonCpp{
//Forward declaration
template <class Element> class BlockingQueueImpl;

template <class Element>
class BlockingQueue{
BlockingQueueImpl<Element>* m_pImpl;
//Forbid copy and assignment
BlockingQueue( const BlockingQueue& );
BlockingQueue& operator=( const BlockingQueue& );
public:
BlockingQueue();
~BlockingQueue();
void Push( Element newElement );
Element Pop();
};
}
}

阻塞队列.cpp

#include "BlockingQueue.h"
#include "BlockingQueueImpl.h"

using namespace DRA::CommonCpp;

BlockingQueue<class Element>::BlockingQueue():
m_pImpl( new BlockingQueueImpl<Element>() ){
}

BlockingQueue<class Element>::~BlockingQueue(){
//Let the implementation's destructor handle pending Pops
delete m_pImpl;
}

template<class Element>
void BlockingQueue<Element>::Push( Element newElement ){
m_pImpl->Push( newElement );
}

template<class Element>
Element BlockingQueue<Element>::Pop(){
return m_Impl->Pop();
}

BlockingQueueImpl.h

#pragma once

#include <agents.h> //This is VS2010 Exclusive (Concurrency Runtime)

namespace DRA{ namespace CommonCpp{ template <class Element> class BlockingQueue; } }

namespace DRA{
namespace CommonCpp{
template <class Element>
class BlockingQueueImpl{
Concurrency::unbounded_buffer<Element> m_Queue;
//Only friends can use this class
friend class BlockingQueue<Element>;
BlockingQueueImpl();
~BlockingQueueImpl();
//Forbid copy and assignment
BlockingQueueImpl( const BlockingQueueImpl& );
BlockingQueueImpl& operator=( const BlockingQueueImpl& );
//Members
void Push( Element newElement );
Element Pop();
};
}
}

BlockingQueueImpl.cpp

#include "BlockingQueueImpl.h"

using namespace DRA::CommonCpp;

BlockingQueueImpl<class Element>::BlockingQueueImpl(){
}

BlockingQueueImpl<class Element>::~BlockingQueueImpl(){
}

template<class Element>
void BlockingQueueImpl<class Element>::Push( Element newElement ){
send( m_Queue, newElement );
}

template<class Element>
Element BlockingQueueImpl<class Element>::Pop(){
return receive( m_Queue );
}

错误是:

BlockingQueueImpl.cpp(12): error C2649: 'typename' : is not a 'class'

我尝试在友元声明中的模板参数中添加类,但没有成功

最佳答案

对现有答案的补充:

error C2649: 'typename' : is not a 'class'

我有相同的错误消息,但我的代码看起来略有不同:

template< class T, class TNodeType = SimpleTreeNode<T> ...>
class Tree {
friend class TNodeType; // *** Turns out: WRONG friend declaration

同样适用于 existing answer : 省略 class 关键字(编译器已经知道这是我假设的类型):

template< class T, class TNodeType = SimpleTreeNode<T> ...>
class Tree {
friend TNodeType; // *** OK: note missing `class`keyword

关于c++ - 与模板类 : Compile error 成为 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6626672/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com