-3

首先我不明白为什么我会收到这个错误

error: ‘cout’ was not declared in this scope

对于以下代码

#include <iostream>

namespace a {

    void print() {
            std:cout << "a" << std::endl;
    }           
}       

namespace b {
    using namespace a;

    void print() {
            std:cout << "b" << std::endl;
    }           
}

int main() {

    b::print();

} 

从广义上讲,我正在研究命名空间中的继承行为,因为我本身不需要类(无论如何它们只是单例)。使用命名空间方法需要注意什么建议或陷阱?


编辑:好的,我很抱歉错字。在那种情况下,我可以扩展这个问题吗?

#include <iostream>

namespace a {


    void print2() {
            print();
    }

    void print() {
            std::cout << "a" << std::endl;
    }           
}       

namespace b {
    using namespace a;

    void print() {
            std::cout << "b" << std::endl;
    }           
}

int main() {

    b::print2();

}     

这不会编译错误:未在此范围内声明“打印”

有没有一种方法可以以通用方式模拟类继承?

例如,如果 a 和 b 是类,则将打印 a。如果 print 被声明为 virtual 那么 b 将被打印。

这是否可能,或者命名空间“继承”只是一种廉价的黑客攻击?


编辑2:

在 print2 输出 a 之前声明 print。我想我现在的问题是:在这种情况下有没有办法或模拟虚拟关键字?这样以下将分别打印 b 和 c 。

#include <iostream>

namespace a {

    void print() {
            std::cout << "a" << std::endl;
    }

    void print2() {
            print();
    }

}       

namespace b {
    using namespace a;

    void print() {
            std::cout << "b" << std::endl;
    }
}

namespace c {

    using namespace a;

    void print() {
            std::cout << "c" << std::endl;
    }
 }

int main() {

    b::print2();
    c::print2();

}      
4

1 回答 1

1

你拼错std::cout了(std:cout)。

在您的代码std:中为goto. 声明的其余部分是:

cout << "a" << std::endl; 

因此,编译器抱怨 unknown identifier cout

更新:

修正错字后,将函数顺序更改为:

void print() {
        std::cout << "a" << std::endl;
}           

void print2() {
        print();
}

更新 2:

在您再次编辑问题后,它完全失去了最初的意义。但答案是No。不,您不能继承命名空间。

于 2013-08-12T14:47:00.960 回答