我有一个我写过的课,意在表示向量(在线性代数意义上)。我刚开始编写它所以它还没有完成,但我已粘贴它和一些测试代码here
我不确定发生了什么。我打算写一个重载的运算符<<在一秒钟内进行测试,所以我继续把它放在我的main函数中(所以我可以使用编译器错误来确保我已经正确地编写了它)。
这个警告意味着什么?为什么要查看v的地址?我尝试从v中删除括号,最后得到this,这是一堆可怕的模板错误: `
In function 'typename boost::range_const_iterator<C>::type boost::range_detail::boost_range_begin(const C&) [with C = vect<float, 3u>]':
/usr/local/include/boost/range/begin.hpp:164: instantiated from 'typename boost::range_const_iterator<C>::type boost::begin(const T&) [with T = vect<float, 3u>]'
prelude/more_stdlib_ostreaming.hpp:64: instantiated from 'void more_stdlib_ostreaming_detail::print_range(std::basic_ostream<_CharT, _Traits>&, const Range&) [with C = char, Tr = std::char_traits<char>, Range = vect<float, 3u>]'
prelude/more_stdlib_ostreaming.hpp:76: instantiated from 'typename more_stdlib_ostreaming_detail::snd<typename R::iterator, std::basic_ostream<_CharT, _Traits>&>::type operator<<(std::basic_ostream<_CharT, _Traits>&, const R&) [with C = char, Tr = std::char_traits<char>, R = vect3f]'
t.cpp:42: instantiated from here
Line 45: error: 'const class vect<float, 3u>' has no member named 'begin'`
我可以看到这里发生了什么,所以。看起来它以某种方式使用boost的范围并尝试迭代我的容器,它失败了因为我没有定义begin()和end()。如果我使用v(some_float)而不是没有parens来实例化v,就会发生同样的事情。
所以,有两个问题:
为什么v()
的行为与v
不同?我认为声明一个没有parens的对象总是调用默认的ctor,并明确调用默认的ctor没有区别?
什么是codepad的编译器(gcc 4.1.2)在这里做什么?它是否有自动尝试生成适当运算符的模板&lt;
另外,请随时告诉我其他任何我在做愚蠢/错误/错误的风格(除了滚动我自己的矩阵数学库以获得乐趣,我知道这是不必要的。我这样做是为了练习)< / p>
答案 0 :(得分:4)
首先,vect3f v();
声明一个函数(名为v
),不带参数并返回vect3f
。并且为此函数指针调用正在调用的operator<<
(它被隐式转换为bool
,因为函数指针没有重载。)
vect3f v;
是创建默认构造对象的正确方法。
不,编译器不会尝试为您生成ostream& operator<<(ostream& /* ... */)
。但是对于所有基本类型甚至一些其他类型(例如std::string
)都有很多重载。
您可以检查所有基本过载here。