Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;模板-参数处的类型/值不匹配_C++_Templates - Fatal编程技术网

C++ C++;模板-参数处的类型/值不匹配

C++ C++;模板-参数处的类型/值不匹配,c++,templates,C++,Templates,我得到了这些错误 的模板参数列表中参数1处的类型/值不匹配 “模板类SasEngineQueue” 的模板参数列表中参数2处的类型/值不匹配 “模板类SasEngineQueue” 但是如果我使用带有std::string的SasEngineQueue类的模板参数,这是可以的,但是正如下面的代码所示,如果我使用std::vector,则会出现错误。为什么? 类引擎{ 私人: 无符号字符地址; SasEngineQueue-sasQ; SasTCP_-IP-sasstransport; };

我得到了这些错误

的模板参数列表中参数1处的类型/值不匹配 “模板类SasEngineQueue”

的模板参数列表中参数2处的类型/值不匹配 “模板类SasEngineQueue”

但是如果我使用带有std::string的SasEngineQueue类的模板参数,这是可以的,但是正如下面的代码所示,如果我使用std::vector,则会出现错误。为什么?


类引擎{
私人:
无符号字符地址;
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();