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();
}
恩,为什么你不能做什么呢?关于你想要做的第二个版本是什么,什么阻止你做它?问一个(文本)问题,不要只是发布代码。我们不是一个差异化工具,我们不是一个编译器。 – jalf 2011-04-04 19:47:53
与视觉2010年,如果我没有给出模板的定义 struct ISocket;不编译。为什么要低调这一点,你认真吗?! –
Guillaume07
2011-04-04 19:50:38
...即使我们是一个编译器,我们也不会解析这个输入。 – 2011-04-04 19:51:46