c++ 클래스 템플릿 구현 후 main 함수에서 호출시 오류

cbh0819의 이미지

Vector.h

#include <string>
#include <iostream>
#include <cmath>
using std::cout;
using std::endl;
 
template <typename T>
 
class Vector
{
private:
    T *data;      // 각 블록 당 담고 있는 데이터
    int length;   // 컨테이너가 갖고 있는 전체 데이터의 개수
    int capacity; // 컨테이너가 가질 수 있는 전체 데이터 용량
public: 
    ...
}
 
template <typename V>
Vector<V> inner_product(Vector<V> v1, Vector<V> v2)
{
    Vector<V> temp(v1.size());
    for (int i = 0; i < temp.size(); i++)
        temp.push_back(0);
 
    if (v1.size() != v2.size())
        cout << "Incorrect Inner Product Try " << endl;
 
    for (int i = 0; i < v1.size(); i++)
    {
        temp[i] = v1[i] * v2[i];
    }
 
    return temp;
}

main.cpp

int main()
{
    Vector<int> int_v1;
    Vector<int> int_v2;
 
    for (int i = 0; i < 5; i++)
    {
        int_v1.push_back(0);
        int_v2.push_back(i + 4);
    }
 
    cout << "size of v1: " << int_v1.size() << endl;
 
    cout << "Entry of v1: [ ";
    for (int i = 0; i < int_v1.size(); ++i)
    {
        cout << int_v1[i] << " ";
    }
    cout << "] " << endl;
    cout << "norm of v1: " << int_v1.norm() << endl;
    cout << endl;
 
    cout << "size of v2: " << int_v2.size() << endl;
 
    cout << "Entry of v2: [ ";
    for (int i = 0; i < int_v2.size(); ++i)
    {
        cout << int_v2[i] << " ";
    }
    cout << "] " << endl;
    cout << "norm of v2: " << int_v2.norm() << endl;
    cout << endl;
 
    Vector<int> int_v3(int_v1.size());
    for (int i = 0; i < 5; i++)
    {
        int_v3.push_back(0);
    }
    cout << "v3's length: " << int_v3.size() << endl;
    cout << "inner product of vectors: [ ";
 
    int_v3 = inner_product(int_v1, int_v2);
    for (int i = 0; i < int_v1.size(); ++i)
    {
        cout << int_v3[i] << " ";
    }
    cout << "] " << endl;
    cout << endl;
 
    return 0;
}

위와 같은 식으로 클래스에 대한 선언과 정의가 함께 포함된 Vector.h 파일과 이를 include 하여 main 함수 내에서 inner_product 함수를 실행하고자 합니다. 다만 실행시 다음과 같은 에러가 발생하는데, 이를 처리할 수 있는 방법이 있을까요?

error: lvalue required as left operand of assignment
temp[i] = v1[i] * v2[i];

추가로 inner_product 함수를 클래스 내 멤버함수로 넣어서 template 에 함께 걸리게(적절한 표현인지는 잘 모르겠습니다) 하여 사용할 수 있는 방법이 있다면 어떤 식으로 코드를 작성해야 할까요?

답변 미리 감사드립니다.

익명 사용자의 이미지

Quote:
error: lvalue required as left operand of assignment

대입문의 왼쪽 피연산자로는 lvalue가 필요하다고 합니다.
말인즉슨 지금은 lvalue가 아니라는 뜻이겠죠.

그렇다면 대체 temp[i]는 무엇일까요?

알 수 없습니다. 알려주지 않으셨으니까요.
tempVector 타입 클래스 인스턴스인데, 여기에 subscript 연산을 적용했다는 것은 해당 연산자를 어디선가 오버로딩했다는 뜻이겠죠?

아마도 아래와 같이 생략된 코드 어딘가에 연산자 오버로딩 함수가 있겠지요.

public: 
    ...
}

아마도 subscript 연산자를 오버로딩하면서 값을 반환하도록 작성하신 것 같은데, 참조를 반환하도록 해야 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.