2012-09-06 46 views
2

下面是两个简化的代码示例:第一个编译得很好,第二个发出编译错误(没有运算符< <找到了,它需要左手操作符ByteVector ...)。为什么使用指令的范围有所作为?

这两个示例唯一的区别在于使用指令的布局。

我不想知道失败的原因(你有没有足够的信息来回答这个问题),我只是在它为什么做任何区别在哪里放置using感兴趣。

我会期待在这两个例子中完全相同的行为。

编译没有错误

ByteVector Test() 
{ 
    using Base::operator <<; 

    ByteVector foo; 
    int bar = 1; 
    foo << bar; 
    return foo; 
} 

与错误编译

using Base::operator <<; 

ByteVector Test() 
{ 
    ...same as above, without using 
} 

的额外信息:

< <使用被定义为操作员如下

template<typename T> 
ByteVector& operator<<(ByteVector &, const T&){...}; 
+1

“编译错误”与“不编译”不同吗? –

+1

如果你可以发布实际的错误可能会有帮助吗? –

+0

实际的错误是:二进制<<:没有找到操作符,它需要一个类型为ByteVector的左侧操作数,或者没有可接受的转换 – nabulke

回答

0

我唯一想到的就是Visual Studio。如果是这种情况,您可能需要将using指令放在相应的#include之后。由于页面上的一句话说:

推杆的使用指令在源代码文件的开头 减少与智能感知异常行为的可能性。

否则,它应该没有任何区别。

+0

我正在使用Visual Studio。但是我对IntelliSense没有任何问题,它不会编译!但是,如果我按照您的建议将使用放在文件的开头,那么我会检查它是否有所不同。 – nabulke

+0

刚刚测试过将使用放在文件的开头:它仍然不能编译。它只在函数作用域的_inside_时使用。 – nabulke

+0

@nabulke对不起,它没有帮助。 – shinkou

相关问题