Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > error C2679: binary '=' : no operator…


Автор: nicvc 1.3.2007, 21:19
VC++6, ADO, MSSQL

В функции добавления в дерево узлов из БД – вот такая ошибка:
error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class _variant_t' (or there is no acceptable conversion)

Код такой:
                       // чтение полей таблицы
        
        int iElementID = -1;
                        //long iElementID = -1;
        int iParentID = -1;
                        // long iParentID = -1;
        CString strName;

        if (m_pRS->Fields->Item["ElementID"]->ActualSize > 0)
        {
            iElementID = m_pRS->Fields->Item["ElementID"]->Value; ///////////
        }
        if (m_pRS->Fields->Item["ParentID"]->ActualSize > 0)
        {
            iParentID = m_pRS->Fields->Item["ParentID"]->Value; ////////////
        }
        if (m_pRS->Fields->Item["ElementName"]->ActualSize > 0)
        {
            strName = m_pRS->Fields->Item["ElementName"]->Value; ///////////
            strName.TrimRight();
        }

Три ошибки в строках, отмеченных /////////.
Если int поменять на long, то ошибка только одна – в строке с strName.

Добавлял вот это:
#include <iostream>
#include <algorithm>
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
#include <functional>
#include <stdlib.h>
using namespace std;

не помогло.

Ставил перед знаком = знак +   - тоже не помогло.
Подскажите, в чем дело? Кто-нибудь встречался?

Автор: Earnest 2.3.2007, 16:26
Делай явное преобразование:
для всех интов пиши так:  int abc = (unsigned)v;
для строк так: CString str = (LPCTSTR)(_bstr_t)v;
Ничего дополнительно включать не нужно.

Автор: nicvc 2.3.2007, 20:50
Благодарю.

Начал с первого инта и сразу понял, что не знаю как использовать подсказку.

Пробовал так:

int v = -1;
int iElementID = (unsigned)v;

Ошибка та же.

А со строкой тем более даже не знаю с чего начать.

Подскажите пожалуйста поподробнее применительно к моему коду.

Автор: Greeen 2.3.2007, 23:42
Попробуй так
Код

strName = (LPCTSTR)(_bstr_t)m_pRS->Fields->Item["ElementName"]->Value;

Автор: nicvc 3.3.2007, 01:33
Благодарю.

Строка работает.
А с интами ничего не получается.
Пробовал даже аналогично строке.

Ситуацию портит то, что необходимо присваивать значение -1 и то, что далее
присваивается m_pRS, т.е. не зная логики все не так просто.

Помогите еще с интами.

Автор: Greeen 3.3.2007, 13:07
Код

iElementID = (int)m_pRS->Fields->Item["ElementID"]->Value

Автор: nicvc 3.3.2007, 21:45
Не работает.

Ошибка такая:
error C2440: 'type cast' : cannot convert from 'class _variant_t' to 'unsigned int'

Не понятно, что делать со значением -1?


PS:
Я тут копнул откуда у меня этот код и выяснил, что из работающего кода, но 
он сделан в VisualStudio6.
У меня VS6 нет, только VC++6.

Может все-таки дело в отсутствии каких-то библиотек?

Автор: Earnest 4.3.2007, 14:27
Цитата(nicvc @  3.3.2007,  22:45 Найти цитируемый пост)
Я тут копнул откуда у меня этот код и выяснил, что из работающего кода, но 
он сделан в VisualStudio6.
У меня VS6 нет, только VC++6.

Что-то я разницы не улавливаю...

У меня такой код в VС++ 6 компилируется:

int iElementID = (long)v; где v = _variant_t.
Преобразование не к int, а именно к long или unsigned.
У тебя ведь, если  iElementID объявлен как long, компилируется?

Цитата(nicvc @  3.3.2007,  22:45 Найти цитируемый пост)
Не понятно, что делать со значением -1?

Подумаешь, какие нежности! smile  Куда оно денется? Ну преобразуешь ты 0xFFFFFFFF к int, и что получишиь? Правильно, -1.

Автор: nicvc 4.3.2007, 23:52
Благодарю.

Так работает:

int iElementID = -1;
iElementID =  (long)m_pRS->Fields->Item["ElementID"]->Value;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)