gpt4 book ai didi

c++ - pimpl 习语和模板类 friend

转载 作者:太空宇宙 更新时间:2023-11-04 12:27:13 25 4
gpt4 key购买 nike

我正在尝试使用 pimpl 习惯用法来隐藏一些蹩脚的模板代码,但我无法为 body 类 friend 的派生类提供对 handle 类的访问权限。我从 MSVC 9 sp1 收到错误 C2248。下面是一些复制错误的代码:

//
// interface.hpp
//
namespace internal{
template<class T>
class specific_body;
}

class interface
{
struct body;
body *pbody_;
interface(body *pbody);

template<class T>
friend class internal::specific_body;

public:

~interface();

interface(const interface &rhs);

bool test() const;

static interface create( bool value );
};

//
// interface.cpp
//
struct interface::body
{
virtual ~body(){}

virtual bool test() const = 0;

virtual interface::body *clone() const = 0;
};

class true_struct {};
class false_struct {};

namespace internal {

template< class T>
class specific_body : public interface::body
{ // C2248
public:

specific_body(){}

virtual bool test() const;

virtual interface::body *clone() const
{
return new specific_body();
}
};

bool specific_body<true_struct>::test() const
{
return true;
}

bool specific_body<false_struct>::test() const
{
return false;
}

} //namespace internal

interface::interface(body *pbody) : pbody_(pbody) {}

interface::interface(const interface &rhs) : pbody_(rhs.pbody_->clone()) {}

interface::~interface() { delete pbody_; }

bool interface::test() const
{
return pbody_->test();
}

interface interface::create(bool value )
{
if ( value )
{
return interface(new internal::specific_body<true_struct>());
}
else
{
return interface(new internal::specific_body<false_struct>());
}
}

//
// main.cpp
//
// #include "interface.hpp"
//

int _tmain(int argc, _TCHAR* argv[])
{
interface object( interface::create(true));

if ( object.test() )
{
// blah
}
else
{
}
return 0;
}

如果有任何帮助,我将不胜感激,我正在尝试向 interface 的用户隐藏 interface::bodyspecific_body 实现从我的问题来看并不明显。

最佳答案

需要在模板测试方法的显式实例化中加入template<>

template<> // add this line
bool specific_body<true_struct>::test() const
{
return true;
}

关于c++ - pimpl 习语和模板类 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579492/

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