2011-04-04 188 views
-2
template<class T> struct ISocket 
{ 
    void connect(){} 
    void raw_socket(){} 
}; 

template <class SocketType, class Arg1,class Arg2> 
struct ISocket< SocketType(Arg1,Arg2) > 
{ 
    typedef SocketType socket_type; 
    typedef Arg1 arg_type; 
    typedef Arg2 arg_type2; 

    socket_type* raw_socket_; 

    ISocket():raw_socket_(&SocketType()){} 


    socket_type& raw_socket(){return *raw_socket_;} 


    void connect() 
    { 
     raw_socket_->connect(); 
    } 
}; 

为什么我有义务定义模板struct ISocket; ?下面的代码不VS2010下编译,当您尝试使用的ISocket并调用connect例如模板专业化

template<class T> struct ISocket; 

template <class SocketType, class Arg1,class Arg2> 
struct ISocket< SocketType(Arg1,Arg2) > 
{ 
    typedef SocketType socket_type; 
    typedef Arg1 arg_type; 
    typedef Arg2 arg_type2; 

    socket_type* raw_socket_; 

    ISocket():raw_socket_(&SocketType()){} 


    socket_type& raw_socket(){return *raw_socket_;} 


    void connect() 
    { 
     ref_raw_socket_->connect(); 
    } 
}; 

我这个代码中调用:

struct SocketTcp 
{ 
    void setup(std::string ip,int port) 
    { 
     std::cout << ip.c_str() << " " << port << "\n"; 
    } 

    void connect() 
    { 

    } 
}; 


typedef ISocket< SocketTcp(std::string, int) > Socket; 

int main() 
{ 

    ISocket<Socket> s; 

    s.connect(); 
    s.raw_socket(); 
} 
+0

恩,为什么你不能做什么呢?关于你想要做的第二个版本是什么,什么阻止你做它?问一个(文本)问题,不要只是发布代码。我们不是一个差异化工具,我们不是一个编译器。 – jalf 2011-04-04 19:47:53

+0

与视觉2010年,如果我没有给出模板的定义 struct ISocket;不编译。为什么要低调这一点,你认真吗?! – Guillaume07 2011-04-04 19:50:38

+0

...即使我们是一个编译器,我们也不会解析这个输入。 – 2011-04-04 19:51:46

回答

2

首先, ref_raw_socket_->connect();。您没有会员 ref_raw_socket_,只有 raw_socket_
其次,您将其初始化为临时SocketType()。在你的构造函数之后,那个对象被销毁了,不再存在了,你的指针现在是一个悬挂指针,如果你使用它,它是未定义的行为。
第三,你期望作为你的 ISocket的模板参数有什么作用?
编辑
这个ISocket<Socket> s;对你的typedef没有任何意义。你用你的ISocket作为你的参数ISocket?如果我改变调用点到这一点:

typedef ISocket< SocketTcp(std::string, int) > Socket; 

int main(){ 
    Socket s; 
// ^^^^^^ not ISocket<Socket> 

    s.connect(); 
    s.raw_socket(); 
} 

和更改构造函数,这个(并添加一个析构函数):

ISocket() 
    : raw_socket_(new SocketType()) 
{} 

~ISocket(){ 
    delete raw_socket_; 
} 

代码编译只是没有错误的罚款。为什么我使用new,请参阅编辑前的第二点。

+0

这会比评论更好。 – 2011-04-04 20:04:47

+0

是的,的确,我已经添加了关于ref_raw_socket – Guillaume07 2011-04-04 20:06:09

+1

的更正@The Guy:是的,第一次修改本来是,但现在不再了。 :)你不能真正格式化你的代码与评论中的换行符。 – Xeo 2011-04-04 20:14:54