“>”标记之前的预期主表达式
expected primary-expression before ‘>’ token
我有这样的代码:
class Client2ServerProtocol {
};
class ProtocolHelper {
public:
template<class ProtocolClass>
int GetProtocolId() {
return -1;
}
};
template<> inline int
ProtocolHelper::GetProtocolId<Client2ServerProtocol>() {
return 1;
}
template<typename PROTOCOL_HELPER>
class Dispatcher {
public:
template<typename PROTOCOL_CLASS>
void Subscribe(int msgId) {
int protoId = helper.GetProtocolId<PROTOCOL_CLASS>();
printf("Subscribe protoId %d, msgId %d", protoId, msgId);
}
PROTOCOL_HELPER helper;
};
int main() {
Dispatcher<ProtocolHelper> dispatcher;
dispatcher.Subscribe<Client2ServerProtocol>(1);
return 0;
}
它在 MSVC 下成功编译(并工作),但 gcc 抱怨语法无效:
test.cc:23:56: error: expected primary-expression before ‘>’ token
int protoId = helper.GetProtocolId();
test.cc:23:58: error: expected primary-expression before ‘)’ token
我做错了什么?
int protoId = helper.GetProtocolId();
你只需要加上template
关键字来表示它跟在一个模板之后:
int protoId = helper.template GetProtocolId<PROTOCOL_CLASS>();
^^^^^^^^
我有这样的代码:
class Client2ServerProtocol {
};
class ProtocolHelper {
public:
template<class ProtocolClass>
int GetProtocolId() {
return -1;
}
};
template<> inline int
ProtocolHelper::GetProtocolId<Client2ServerProtocol>() {
return 1;
}
template<typename PROTOCOL_HELPER>
class Dispatcher {
public:
template<typename PROTOCOL_CLASS>
void Subscribe(int msgId) {
int protoId = helper.GetProtocolId<PROTOCOL_CLASS>();
printf("Subscribe protoId %d, msgId %d", protoId, msgId);
}
PROTOCOL_HELPER helper;
};
int main() {
Dispatcher<ProtocolHelper> dispatcher;
dispatcher.Subscribe<Client2ServerProtocol>(1);
return 0;
}
它在 MSVC 下成功编译(并工作),但 gcc 抱怨语法无效:
test.cc:23:56: error: expected primary-expression before ‘>’ token int protoId = helper.GetProtocolId();
test.cc:23:58: error: expected primary-expression before ‘)’ token
我做错了什么? int protoId = helper.GetProtocolId();
你只需要加上template
关键字来表示它跟在一个模板之后:
int protoId = helper.template GetProtocolId<PROTOCOL_CLASS>();
^^^^^^^^