xml_attribute.h
#pragma once
#ifndef XML_ATTRIBUTET_H
#define XML_ATTRIBUTET_H
#include <string>
#include <iostream>
struct XML_AttributeT{
std::string tag;
std::string value;
//constructors
explicit XML_AttributeT(std::string const& tag, std::string const& value);
explicit XML_AttributeT(void);
//overloaded extraction operator
friend std::ostream& operator << (std::ostream &out, XML_AttributeT const& attribute);
};
#endif
xml_attribute.cpp
#include "xml_attribute.h"
//Constructors
XML_AttributeT::XML_AttributeT(std::string const& tag_, std::string const& value_)
: tag{tag_}
, value{value_}
{}
XML_AttributeT::XML_AttributeT(void){}
//overloaded extraction operator
std::ostream& operator << (std::ostream &out, XML_AttributeT const attribute){
return out << attribute.tag << "=" << attribute.value;
}
driver.cpp
#include <iostream>
#include <cstdlib>
#include "xml_attribute.h"
int main(){
using namespace std;
XML_AttributeT a();
cout << a << endl;
return EXIT_SUCCESS;
}
Выходные данные драйвера — «1», но я хочу, чтобы это был знак «=».
Почему выводит ссылку на a?
Если я изменю XML_AttributeT a();
в XML_AttributeT a;
это даже не компилируется.
Что я сделал не так?
Крис это правильно. Ваша первоначальная проблема заключается в том, что XML_AttributeT a()
интерпретируется как объявление функции. clang++
на самом деле предупредит вас об этом:
Untitled.cpp:33:21: warning: empty parentheses interpreted as a function declaration [-Wvexing-parse]
XML_AttributeT a();
Ты можешь использовать a{}
вместо этого, чтобы исправить это.
В этот момент вы получаете новую ошибку:
Untitled.cpp:34:10: error: use of overloaded operator '<<' is ambiguous (with operand types 'ostream' (aka 'basic_ostream<char>') and 'XML_AttributeT')
cout << a << endl;
Это из-за того, что сказал Джогожапан. Ваш реализован operator<<
использует XML_AttributeT const
в качестве типа атрибута вместо XML_AttributeT const &
, Если вы исправите это, он скомпилируется и даст вам желаемый результат.
Других решений пока нет …