错误:没有重载函数的实例

Posted

技术标签:

【中文标题】错误:没有重载函数的实例【英文标题】:Error : no instance of overloaded function 【发布时间】:2014-02-06 08:29:09 【问题描述】:

我正在尝试使用以下代码在我的数据库 (SQL Server 2008) 中插入一些行:

CDB.cpp

#include "CDB.h"

void CDB::ajouterAlerte()
    SqlConnection      ^ mysqlConnection;
    SqlDataAdapter     ^ myDataAdapter;
    DataSet            ^ myDataSet;
    DataRow            ^ myRow;
    SqlParameter       ^ myParameter;

    try
    
        mySQLConnection = gcnew SqlConnection("Data Source=NECTARYS-PC;Initial Catalog=MonitoringN;Integrated Security=True;");
        myDataAdapter = gcnew SqlDataAdapter();
        myDataSet = gcnew DataSet();

        // Open up the connection
        mySQLConnection->Open();

        myDataAdapter->SelectCommand = gcnew SqlCommand("select * from Alerte", mySQLConnection);
        myDataAdapter->InsertCommand = gcnew SqlCommand("insert into Alerte (motif,dateAlerte," +
            "fixee,nomPoste,nomApplication,nomFichier,FichierModel_id) values (@motif,@dateAlerte," +
            "@fixee,@nomPoste,@nomApplication,@nomFichier,@FichierModel_id)", mySQLConnection);

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@motif", SqlDbType::VarChar));
        myParameter->SourceColumn = "motif";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@dateAlerte", SqlDbType::VarChar));
        myParameter->SourceColumn = "dateAlerte";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@fixee", SqlDbType::Bit));
        myParameter->SourceColumn = "fixee";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@nomPoste", SqlDbType::VarChar));
        myParameter->SourceColumn = "nomPoste";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@nomApplication", SqlDbType::VarChar));
        myParameter->SourceColumn = "nomApplication";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@nomFichier", SqlDbType::VarChar));
        myParameter->SourceColumn = "nomFichier";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@FichierModel_id", SqlDbType::Int));
        myParameter->SourceColumn = "FichierModel_id";
        myParameter->SourceVersion = DataRowVersion::Current;

        time_t now = time(0);
        tm ltm;
        localtime_s(&ltm, &now);
        std::stringstream str;
        str << ltm.tm_mday
            << "/"
            << 1 + ltm.tm_mon
            << "/"
            << 1900 + ltm.tm_year
            << " "
            << 1 + ltm.tm_hour
            << ":"
            << 1 + ltm.tm_min
            << ":"
            << 1 + ltm.tm_sec;
        String^ dateAjoutSysteme = gcnew System::String(str.str().c_str());

        Boolean fixee = true;

        myDataAdapter->Fill(myDataSet, "Alerte");
        myRow = myDataSet->Tables["Alerte"]->NewRow();
        myRow->ItemArray[0] = "A";
        myRow->ItemArray[1] = dateAjoutSysteme;
        myRow->ItemArray[2] = fixee;
        myRow->ItemArray[3] = "B";
        myRow->ItemArray[4] = "C";
        myRow->ItemArray[5] = "D";
        myRow->ItemArray[6] = NULL;
        myDataSet->Tables["Alerte"]->Rows->Add(myRow);

        //we use insertcommand property for the update.
        myDataAdapter->Update(myDataSet, "Alerte");
    
    catch (Exception ^ e) 
        Console::Write(e->ToString());
    
    __finally 
        mySQLConnection->Close();
        system("PAUSE");
    


LISTSTR CDB::getListeAppsMetiers()

    SqlConnection      ^ mySQLConnection;
    SqlCommand         ^ mySQL;
    SqlDataReader      ^ myReader;
    SqlDataAdapter     ^ myDataAdapter;
    DataSet            ^ myDataSet;
    DataRow            ^ myRow;
    SqlParameter       ^ myParameter;

    LISTSTR::iterator i;
    LISTSTR            listeAppsMetiers;

    try
    
        mySQLConnection = gcnew SqlConnection("Data Source=NECTARYS-PC;Initial Catalog=MonitoringN;Integrated Security=True;");
        mySQL = gcnew SqlCommand("select * from AppMetier", mySQLConnection);

        mySQLConnection->Open(); // Open up the connection
        myReader = mySQL->ExecuteReader();

        while (myReader->Read())
            listeAppsMetiers.insert(listeAppsMetiers.end(), myReader["chemin"]->ToString()); // the error is marked at the point, just before insert(...

        return listeAppsMetiers;
    
    catch (Exception ^ e)
    
        Console::Write(e->ToString());
    
    __finally
    
        myReader->Close();
        mySQLConnection->Close();
    

CDB.h

#using <mscorlib.dll>
#using <System.dll>
#using <system.data.dll>
#using <System.Xml.dll>

#pragma warning (disable:4786)
#include <list>
#include <sstream>
#include <time.h>
#include <string>
#include <iostream>
#include <tchar.h>

using namespace System;
using namespace System::Data;
using namespace System::Xml;
using namespace System::Data::SqlClient;

typedef std::list<std::string> LISTSTR;

class CDB
    CDB() //ctor
    virtual ~CDB()

public:
    void ajouterAlerte()
    LISTSTR getListeAppsMetiers()
;

但是,我在标记的行上有错误,我还没有找到解决方法:

没有重载函数实例“std::list<_ty _alloc>::insert[with _Ty=std::string, _Alloc=std::allocator]" 匹配参数列表参数类型是: (std::_List_iterator>>, System::String ^) 对象类型为:LISTSTR

有什么绝妙的主意吗?

【问题讨论】:

您需要将String^ 转换为std::string。看这里:***.com/questions/946813/… @AlexFarber,感谢您的回复,但我需要转换什么? myReader["chemin"]-&gt;ToString()String^,你需要std::string 是的,就是这样。非常感谢你。请回答以解决此主题。 【参考方案1】:

正如上面 cmets 中所解释的:您正在尝试将值 myReader["chemin"]-&gt;ToString()(属于 Microsoft 发明的类型 String^)添加到正常的 std::strings 列表中。微软Stringstd::string之间没有隐式转换;您必须明确地进行转换。

幸运的是,有一个 CLR 库函数可以做到这一点:marshal_as

#include <msclr/marshal_cppstd.h>

...

while (myReader->Read()) 
    listeAppsMetiers.insert(
        listeAppsMetiers.end(),
        msclr::interop::marshal_as<std::string>( myReader["chemin"]->ToString() ));

此答案中的代码复制自@sriwantha-attanayake 对类似问题的回答:https://***.com/a/8896629/1424877

【讨论】:

以上是关于错误:没有重载函数的实例的主要内容,如果未能解决你的问题,请参考以下文章

MFC:CSting IntelliSense:没有重载函数的实例

错误 C2511 - 未找到重载的成员函数

没有重载函数“AfxBeginThread”的实例与参数列表匹配

没有重载函数的实例匹配参数列表 C++

多个重载函数 to_string 实例与参数列表匹配

错误 C2661:'node::node':没有重载函数需要 3 个参数