XCode 4.5.2에서 아래 정의 된 클래스 Proxy
은 컴파일되지 않습니다. 필요한 경우 특정 컴파일러에 대한 자세한 내용을 제공 할 수 있지만 XCode 구성에서 아무 것도 변경하지 않았으므로 기본값이어야합니다. VStudio Express에서 컴파일됩니다. 내가 Proxy
를 참조하고있어 완전히 정의되기 전에 -템플릿 클래스의 내부 클래스는 XCode 4.5.2에서 컴파일되지 않습니다.
내가 무슨 일이 일어나고 있는지 이해
No type named 'iterator' in 'std::__1::list<ASW::Cache<std::__1::basic_string<char>>::Proxy, std::__1::allocator<ASW::Cache<std::__1::basic_string<char>>::Proxy>>'
(캐시에 템플릿 매개 변수가 std::basic_string<char>
입니다) :
#include <list>
#include <boost/thread/tss.hpp>
template <typename T>
class Cache
{
public:
class Proxy : public T
{
friend class Cache;
private:
std::list<Proxy> & m_refList;
typename std::list<Proxy>::iterator m_clsPosition;
Proxy(std::list<Proxy> & refList) : m_refList(refList) {}
};
private:
std::list<Proxy> m_clsList;
typename std::list<Proxy>::iterator m_clsCurrent;
static void Release(Proxy * ptrProxy)
{
ptrProxy->m_refList.splice(ptrProxy->m_refList.m_clsCurrent,
ptrProxy->m_refList,
ptrProxy->m_clsPosition);
if (ptrProxy->m_refList.m_clsCurrent == ptrProxy->m_refList.end())
--(ptrProxy->m_refList.m_clsCurrent);
}
public:
Cache() {m_clsCurrent = m_clsList.end();}
~Cache()
{
if (m_clsList.size() && m_clsCurrent != m_clsList.begin())
{
// ERROR - Cache not empty
}
}
typedef boost::shared_ptr<Proxy> Ptr;
static Ptr Get()
{
static boost::thread_specific_ptr<Cache> clsCache;
if (clsCache.get() == NULL)
clsCache.reset(new Cache());
Proxy * ptrProxy;
if (clsCache->m_clsCurrent == clsCache->m_clsList.end())
{
clsCache->m_clsList.push_front(Proxy(clsCache->m_clsList));
ptrProxy = &(clsCache->m_clsList.front());
ptrProxy->m_clsPosition = clsCache->m_clsList.begin();
}
else
{
ptrProxy = &(*(clsCache->m_clsCurrent));
ptrProxy->m_clsPosition = clsCache->m_clsCurrent++;
}
return Ptr(ptrProxy, Release);
}
};
컴파일 에러는 라인 typename std::list<Proxy>::iterator m_clsPosition
에 . 그렇다면 iterator
은 컴파일 할 때 Proxy
의 정의가 필요한 이유는 무엇입니까?
데이터 구조의 이유는 1) 오브젝트를 삭제하는 대신 오브젝트를 재사용하고 2) 캐시 된 오브젝트의 반복자를 목록의 해당 위치로 유지함으로써 교정을 촉진하는 것입니다. 누구든지 이러한 문제를 해결하는 방법에 대한 더 좋은 아이디어가 있다면 (이 오류를 해결할 수는 없다), 나는 그것을 듣고 싶어 할 것이다.
기타 의견에서 알 수 있듯이 표준의 제한 때문입니다. 나는 간단히'boost :: container :: list'를 살펴 봤는데, 그것은 불완전한 타입을 포함하도록 설계되었으므로 실행 가능할 것이다. 나는 또한'boost :: ptr_list'를 보았지만, 런타임은리스트에서 노드를 움직이기위한 O (1)가 아니다. 나는 내 자신을 굴리는 것을 끝내 었는데, 나는 이처럼 일반적인 일을하기를 싫어한다. 내가 테스트 한 후에 코드를 게시 할 것이다. – jorgander