作者sarafciel (Cattuz)
看板C_and_CPP
标题Re: [问题] 泛型出现ERROR但编译可过,可执行
时间Mon May 13 13:39:54 2019
※ 引述《s4300026 (s4300026)》之铭言:
: 标题: [问题] 泛型出现ERROR但编译可过,可执行
: 时间: Fri May 10 18:41:31 2019
:
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: win10
:
: 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
: VC++
:
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: #include <string>
:
: 问题(Question):
: 泛型函式可以编译和执行
:
: 但是撰写VC程式码时会出现红字底线 (ERROR), 表示方法未定义
:
: 喂入的资料(Input):
: N/A
:
: 预期的正确结果(Expected Output):
: 是正确的
:
: 错误结果(Wrong Output):
: 红字看起来很碍眼
:
: 程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
: https://ideone.com/6JheE0
:
: 补充说明(Supplement):
:
: 1. VC照片如下
: https://imgur.com/a/7gjzbLY
:
: 2. 当Source.cpp不存在时,不会出现错误,
:
: 但我不是很想只因为这个原因而独立成一个专案。
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.250.235.221
: ※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1557484894.A.E01.html
: ※ 编辑: s4300026 (60.250.235.221), 05/10/2019 18:42:12
: → sarafciel: 把GetSubwstring前的Trans::去掉 05/10 21:28
: 回楼上,今天一早就来试,还真的没有了!
:
: 能请教一下为什麽吗? 我的意思:是方法前面,
:
: 我记得本来就是可加可不加类别名吧?
:
双冒号(::)是用来描述scope的,并不是可加可不加,有些场合一定要加
举个例子
https://ideone.com/PSm7pe
C++允许你在类别外跟类别内定义介面跟名称完全一样的函式
而这个时候你写bar(),编译器只会看global scope找有没有定义可以呼叫的bar
只有加了foo::告诉编译器你要的bar是在
「class foo的scope里」
才能call到里面的那个版本
: 至少在非泛型使用上都没问题...
:
: 原本我想要在.cpp上撰写泛型方法
:
延续上面的例子 这时候我把函式内的定义拿掉 只留宣告
然後把定义写在函式外,但是不加foo::的scope描述:
https://ideone.com/kTLuCC
编译器报undefined reference,因为他以为你要定义的是global scope的bar函式
所以你类别外定义时必须写成foo::bar,让编译器知道你是在定义class foo下的函式
: 後来怎麽写都过不了,最後只能把他贴回.h撰写
:
: 方法前面的类别名是那时候遗留下来的
: ※ 编辑: s4300026 (114.137.115.219), 05/13/2019 08:44:00
对,你为了在类别外定义时能编译过,所以写在外面时有把scope::加上去
然後因为template不给过的缘故,你把定义搬回去class内了
而在class内编译器自然很清楚你在写的是该class scope的函式
所这个时候是不用加foo::去指定scope的(当然有些例外,比方说菱形继承)
至於template为什麽过不了,因为template是编译时再去生成相对应的c++ code
你没有用到它就不会生,这是为什麽你没有souce.cpp他不会报错的原因
反过来说,因为他是用到时才去生成,所以生程式码时你的模板定义一定要是完整的
如果你把模板定义写在某个A.cpp里,然後在B.cpp要使用在A.hpp宣告的模板
这时候因为B.cpp只能看到A.hpp的模板宣告
位於A.cpp的模板定义他没有看到,自然没办法生
所以模板一般会直接在header里把定义写完
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 210.242.163.170
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1557726002.A.2C7.html
1F:推 ilikekotomi: 上了一课 感谢分享 05/13 20:04
2F:推 s4300026: 感谢~ 我已经明白为什麽我的模板不能放在cpp的原因了! 05/15 08:35
3F:推 s4300026: 但是我对於scope::还是有不了解的地方,我想询问在.h档 05/15 08:37
4F:→ s4300026: class范围内宣告的方法,所谓的不用加scope::是指不能加 05/15 08:39
5F:→ s4300026: 还是加不加都可以? 因为在宣告普通方法的时候,scope:: 05/15 08:40
6F:→ s4300026: 似乎是不影响VC的编译的(都可以编译且无warning) 05/15 08:41
7F:→ s4300026: 05/15 08:51
8F:→ s4300026: 我是明白.cpp加不加的差异 我也知道发生宣告 Ambiguous 05/15 08:52
9F:→ s4300026: 时要加,但我不知道当宣告没发生 Ambiguous 时的情况 05/15 08:54
10F:→ s4300026: 因为有时候在写定义时会想到更好的宣告名称,就直接 05/15 09:01
11F:→ s4300026: 或者是更改输出入,把定义处的标题直接复制到宣告式中 05/15 09:03
应该是VS2015还容许这种写法吧
就我自己在VS2017上面试,这种写法是会报错的
早期的gcc也可以写这种style的宣告,现在基本上都会跳error了
另外VS是有支援全专案重新命名的,请好好利用IDE的功能XD
※ 编辑: sarafciel (123.193.54.11), 05/15/2019 19:42:04
12F:推 s4300026: 好窝,感谢XD 05/16 08:19