C++ C++;模板-参数处的类型/值不匹配
我得到了这些错误 的模板参数列表中参数1处的类型/值不匹配 “模板类SasEngineQueue” 的模板参数列表中参数2处的类型/值不匹配 “模板类SasEngineQueue” 但是如果我使用带有std::string的SasEngineQueue类的模板参数,这是可以的,但是正如下面的代码所示,如果我使用std::vector,则会出现错误。为什么?C++ C++;模板-参数处的类型/值不匹配,c++,templates,C++,Templates,我得到了这些错误 的模板参数列表中参数1处的类型/值不匹配 “模板类SasEngineQueue” 的模板参数列表中参数2处的类型/值不匹配 “模板类SasEngineQueue” 但是如果我使用带有std::string的SasEngineQueue类的模板参数,这是可以的,但是正如下面的代码所示,如果我使用std::vector,则会出现错误。为什么? 类引擎{ 私人: 无符号字符地址; SasEngineQueue-sasQ; SasTCP_-IP-sasstransport; };
类引擎{
私人:
无符号字符地址;
SasEngineQueue-sasQ;
SasTCP_-IP-sasstransport;
};
模板
SasEngineQueue类{
公众:
线程安全队列例外Q;
线程安全队列lpCmdQ;
线程安全队列lpRspQ;
};
模板
类ThreadSafeQueue{
受保护的:
队列线程安全Q;
互斥mu;
公众:
int-get(msgType&msg);
无效推送(msgType msg);
void pop();
};
模板
int-ThreadSafeQueue::get(msgType&msg){
锁定保护自动互斥(mu);
if(threadSafeQ.empty()){
//空队
返回-1;
}
msg=threadSafeQ.front();
返回0;
}
模板
void ThreadSafeQueue::push(msgType msg){
锁定保护自动互斥(mu);
threadSafeQ.push(msg);
}
模板
void ThreadSafeQueue::pop(){
锁定保护自动互斥(mu);
threadSafeQ.pop();
}
模板int-ThreadSafeQueue::get(std::vector&msg);
模板void ThreadSafeQueue::push(std::vector msg);
模板void ThreadSafeQueue::pop();
模板int-ThreadSafeQueue::get(std::string&msg);
模板void ThreadSafeQueue::push(std::string msg);
模板void ThreadSafeQueue::pop();
您应该始终指出错误发生的确切位置-这使人们更容易回答
无论如何,问题在于,虽然std::string
是一种类型(特别是std::basic_string
的typedef),但std::vector
不是。它是一个模板,您需要指定向量包含的类型,例如std::vector
您可能希望使其适用于任何向量-不幸的是,这不起作用,因为显式实例化必须指定具体类型。
std::vector
什么?sascenginequeue的模板参数不是模板参数。你所做的是不允许的,坦率地说,这毫无意义。您的模板参数中没有一个是模板参数,但您似乎将它们都视为模板参数。我想你需要仔细了解一下它是如何工作的代码>是一个问题。
class SasEngine{
private:
unsigned char addr;
SasEngineQueue<std::vector, std::vector> sasQ;
SasTCP_IP sasTransport;
};
template<typename exception_t, typename lp_t>
class SasEngineQueue{
public:
ThreadSafeQueue<exception_t> exceptionQ;
ThreadSafeQueue<lp_t> lpCmdQ;
ThreadSafeQueue<lp_t> lpRspQ;
};
template<typename msgType>
class ThreadSafeQueue{
protected:
queue<msgType> threadSafeQ;
mutex mu;
public:
int get(msgType& msg);
void push(msgType msg);
void pop();
};
template<typename msgType>
int ThreadSafeQueue<msgType>::get(msgType& msg){
lock_guard<mutex> autoMutex(mu);
if(threadSafeQ.empty()){
//empty Queue
return -1;
}
msg = threadSafeQ.front();
return 0;
}
template<typename msgType>
void ThreadSafeQueue<msgType>::push(msgType msg){
lock_guard<mutex> autoMutex(mu);
threadSafeQ.push(msg);
}
template<typename msgType>
void ThreadSafeQueue<msgType>::pop(){
lock_guard<mutex> autoMutex(mu);
threadSafeQ.pop();
}
template int ThreadSafeQueue<std::vector>::get(std::vector& msg);
template void ThreadSafeQueue<std::vector>::push(std::vector msg);
template void ThreadSafeQueue<std::vector>::pop();
template int ThreadSafeQueue<std::string>::get(std::string& msg);
template void ThreadSafeQueue<std::string>::push(std::string msg);
template void ThreadSafeQueue<std::string>::pop();