我創建了一個ServerService名稱空間,用於包含類名稱server_datetime。 Server_datetime類作爲Boost示例的教程,但是我通過使用模板參數改進了server_datetime類,以將io_service(boost :: asio :: io_service)和endpoint(tcp :: endpoint(tcp :: v4(),SIZE_DATA))對象插入模板。我遵循下面的例子:編譯器編譯「io_service_」變量顯示爲:不能出現在常量表達式中
using boost::asio::ip::tcp;
namespace ServerService{
template<typename Service, typename Endpoint>
class server_datetime {
public:
server_datetime(){
acceptor_(service_, endpoint_);
for(;;)
{
tcp::socket socket(Service);
acceptor_.accept(socket);
std::string message = make_daytime_string;
boost::system::error_code ignored_error;
boost::asio::write(socket, boost::asio::buffer(message),boost::asio::transfer_all(), ignored_error);
}
}
std::string make_daytime_string(){
std::time_t now = std::time(0);
return std::ctime(&now);
}
virtual ~server_datetime();
private:
tcp::acceptor acceptor_;
Service service_;
Endpoint endpoint_;
};
}
main函數調用server_datetime類通過遵循:
#include "server_datetime.hpp"
using namespace std;
using boost::asio::ip::tcp;
int main() {
const boost::asio::io_service io_service_;
const int SIZE_DATA = 13;
ServerService::server_datetime<io_service_, tcp::endpoint(tcp::v4(),SIZE_DATA) > server;
cout << "" << endl; // prints
return 0;
}
由編譯器編譯的主要功能,編譯器顯示誤差後:
..\src\connectk.cpp: In function 'int main()':
..\src\connectk.cpp:10: error: 'io_service_' cannot appear in a constant-expression
..\src\connectk.cpp:10: error: 'boost::asio::ip::tcp::v4()' cannot appear in a constant-expression
..\src\connectk.cpp:10: error: a function call cannot appear in a constant-expression
..\src\connectk.cpp:10: error: template argument 1 is invalid
..\src\connectk.cpp:10: error: template argument 2 is invalid
..\src\connectk.cpp:10: error: invalid type in declaration before ';' token
我可以使用模板參數列表是「類」嗎?如 'template'如果我想注入對象。 [鏈接](http://stackoverflow.com/questions/213121/c-use-class-or-typename-for-template-parameters) –
2011-04-19 09:47:29
@ Chatsiri.rat:no,在模板參數列表中'class'表示與'typename'相同;都聲明一個類型參數。模板在編譯時被實例化,所以你可以注入的唯一對象是編譯時常量。如果你想注入運行時對象,那必須通過函數或構造函數參數來完成。 – 2011-04-19 09:57:26
我將類文件和ServerService命名空間的主要方法分散到頭文件中。爲什麼編譯器顯示無法創建在類文件上實例化的服務器? – 2011-04-21 05:36:13