Like Tree1Likes
  • 1 Post By Elysia

Returning a reference == int(int (*)()) ??

This is a discussion on Returning a reference == int(int (*)()) ?? within the C++ Programming forums, part of the General Programming Boards category; I have a member function: Code: T& at(int n) { return coeff.at(n); } where coeff is a std::vector<T> When I ...

  1. #1
    Registered User manasij7479's Avatar
    Join Date
    Feb 2011
    Location
    Kolkata@India
    Posts
    2,528

    Returning a reference == int(int (*)()) ??

    I have a member function:
    Code:
            T& at(int n)
            {
                return coeff.at(n);
            }
    where coeff is a std::vector<T>

    When I attempt to use the returned value in a multiplication with another T instantiated to integers, I get the following error:
    Code:
    polynomial.hpp:76:4: error: invalid operands of types ‘int(int (*)())’ and ‘int’ to binary ‘operator*’
    Here is the complete code:
    polynomial.hpp
    Code:
    #ifndef MM_POLY
    #define MM_POLY
    #include<vector>
    #include<string>
    #include<sstream>
    #include<initializer_list>
    #include<stdexcept>
    namespace mm
    {
        
        template<typename T=double>
        class Polynomial
        {
        public:
            Polynomial(std::initializer_list<T> dat)
            {
                for(auto x:dat)
                    coeff.push_back(x);
            }
            Polynomial(int n)
            {
                coeff.reserve(n+1);
            }
            std::string str(std::string var) const
            {
                std::ostringstream os;
                for(uint i=0;i<coeff.size()-1;++i)
                    os<<coeff[i]<<"*"<<var<<"^"<<i<<" + ";
                os<<coeff[coeff.size()-1]<<"*"<<var<<"^"<<coeff.size()-1;
                return os.str();
            }
            T eval(T t) const
            {
                T result = T(0);
                T mul = T(1); 
                for(int i=0;i<=degree();++i,mul*=t)
                    result+=mul*coeff[i];
                return result;
            }
            
            
            int degree() const
            {
                return coeff.size()-1;
            }
            T& at(int n)
            {
                return coeff.at(n);
            }
        private:
            std::vector<T> coeff;
        };
        
        template
        <
        typename T
        >
        std::pair
        <
        Polynomial<T>
        ,T
        >
        SyntheticDivision(Polynomial<T> dividend,Polynomial<T> divisor)
        {
            int qdeg = dividend.degree()-1;
            Polynomial<T> quotient(qdeg);
            T remainder(T());
            if(divisor.degree()!=1)
                throw(std::logic_error("SyntheticDivision:Divisor.Degree !=1"));
            
    
            T h=- divisor.at(0)/divisor.at(1);
    
            for(int i=qdeg;i>=0;--i)
            {
                remainder = dividend.at(i+1) + remainder*h;
                quotient.at(i)=remainder;
            }
            
            return std::pair<Polynomial<T>,T>(quotient,remainder);
        }
    }
    
    #endif
    Similar errors are reported at lines 76,77 and 80.
    main.cpp
    Code:
    #include "polynomial.hpp"
    #include<iostream>
    int main()
    {
        mm::Polynomial<int> dn({2,-3,1}),dv({-1,1});
        auto result = mm::SyntheticDivision<int>(dn,dv);
        std::cout<<result.first.str("x");
    }
    I couldn't produce the problem with a simpler example:
    Code:
    template<typename T>
    class Foo
    {
    public:
        Foo(T t):foo(t){};
        T& val()
        {
            return foo;
        }
    private:
        T foo;
    };
    int main()
    {
        Foo<int> bar(6);
        int xip = 5;
        int bas  = xip * bar.val();
    }
    Last edited by manasij7479; 12-16-2012 at 07:03 AM.
    Manasij Mukherjee | gcc-4.9.2 @Arch Linux
    Slow and Steady wins the race... if and only if :
    1.None of the other participants are fast and steady.
    2.The fast and unsteady suddenly falls asleep while running !



  2. #2
    C++まいる!Cをこわせ!
    Join Date
    Oct 2007
    Posts
    23,031
    >>T remainder(T());
    I believe the compiler is interpreting this as a function declaration or some such.
    Changing it to
    T remainder = T();
    makes it compile for me.

    Code:
    T remainder{T()};
    Works too.
    manasij7479 likes this.
    Quote Originally Posted by Adak View Post
    io.h certainly IS included in some modern compilers. It is no longer part of the standard for C, but it is nevertheless, included in the very latest Pelles C versions.
    Quote Originally Posted by Salem View Post
    You mean it's included as a crutch to help ancient programmers limp along without them having to relearn too much.

    Outside of your DOS world, your header file is meaningless.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Returning by reference
    By cuo741 in forum C++ Programming
    Replies: 1
    Last Post: 12-09-2010, 07:06 AM
  2. returning by reference / value.
    By Kitt3n in forum C++ Programming
    Replies: 4
    Last Post: 05-28-2010, 01:02 PM
  3. returning reference
    By l2u in forum C++ Programming
    Replies: 34
    Last Post: 04-17-2008, 12:29 PM
  4. Returning a reference? Why?
    By Mr_Miguel in forum C++ Programming
    Replies: 12
    Last Post: 09-13-2007, 12:43 PM

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21