相关疑难解决方法(0)

命名空间和操作员解析

我正在使用一个库来定义全局命名空间中的输出流操作符(operator <<).在我自己的命名空间中,我总是在全局命名空间中声明这样的运算符,并且从未遇到过这些运算符的问题.但是现在由于各种原因我需要在我自己的命名空间中声明这些运算符,突然之间,编译器似乎无法找到库中声明的运算符.

这是一个简单的例子,说明了我的问题:

#include <iostream>

namespace A
{
   struct MyClass {};
}

std::ostream & operator<<( std::ostream & os, const A::MyClass & )
   { os << "namespace A"; return os; }

namespace B
{
   struct MyClass {};

   std::ostream & operator<<( std::ostream & os, const B::MyClass & )
      { os << "namespace B"; return os; }
}

namespace B
{
   void Test()
   {
      std::cout << A::MyClass() << std::endl;
      std::cout << B::MyClass() << std::endl;
   }
}

int main()
{
   B::Test();
   return 1;
} …
Run Code Online (Sandbox Code Playgroud)

c++ namespaces operator-keyword

37
推荐指数
4
解决办法
1万
查看次数

为什么我不能将此运算符重载在与结构相同的命名空间中?

我有以下代码:

#include <iostream>
#include <vector>
namespace X {
    std::ostream& operator<<(std::ostream& os,const std::vector<double>& v){
        for (int i=0;i<v.size();i++){os << v[i] << " ";}
        return os;
    }
    namespace Y {
        struct A {std::vector<double> x;};    
        std::ostream& operator<<(std::ostream& os,const A& a){
            os << a.x << std::endl;
            return os;
        }
   }     
}

using namespace X;

int main(int argc, char** argv) {
   std::vector<double> v(10,0);
   std::cout << v << std::endl;
   Y::A a;
   std::cout << a << std::endl;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

第一个重载是有效的,但第二个没有.由于某种原因,它找不到第一个.我收到错误:

no match for 'operator<<' (operand types are …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading ostream

6
推荐指数
1
解决办法
713
查看次数

lnker在重载运算符上完成编译过程时的C++问题

考虑使用以下头文件(c ++): myclass.hpp

#ifndef MYCLASSHPP_
#define MYCLASSHPP_

namespace A {
namespace B {
namespace C {

class myclass { /* Something */ };

myclass& operator+(const myclass& mc, int i);

}}}

#endif
Run Code Online (Sandbox Code Playgroud)

考虑实现文件: myclass.cpp

#include "myclass.hpp"
using namespace A::B::C;

myclass& operator+(const myclass& mc, int i) {
   /* Doing something */
}
Run Code Online (Sandbox Code Playgroud)

考虑主文件: main.cpp

#include "myclass.hpp"

int main() {
   A::B::C::myclass el = A::B::C::myclass();
   el + 1;
}
Run Code Online (Sandbox Code Playgroud)

好吧,链接器告诉我有一个未定义的引用 A::B::C::operator+(A::B::C::myclass const&, int)

这有什么问题?

c++ namespaces operator-overloading linker-errors

2
推荐指数
2
解决办法
81
查看次数