template< class T >
class Foo {
public:
Foo( T t ) { }
};
int main () {
int i = 0;
Foo f( i );
}
在上é¢çš„代ç ä¸ï¼Œç¼–译器抱怨在f&#39;之å‰ç¼ºå°‘模æ¿å‚数。我ç†è§£ä»Žæž„é€ å‡½æ•°çš„å‚æ•°ä¸æŽ¨å¯¼å‡ºç±»çš„模æ¿å‚æ•°ä¸æ˜¯æ ‡å‡†çš„一部分,但我的问题是为什么?编译器是å¦å…·æœ‰éšå¼å®žä¾‹åŒ–Foo<int>
å¹¶è°ƒç”¨å…¶æž„é€ å‡½æ•°æ‰€éœ€çš„æ‰€æœ‰ä¿¡æ¯ï¼Ÿ
修改åŽæ˜Žç¡®è¡¨ç¤ºæˆ‘使用int
(而ä¸æ˜¯short
,long
,void*
ç‰æ¥è°ƒç”¨æž„é€ å‡½æ•°ã€‚ï¼‰
ç”案 0 :(得分:35)
å› ä¸ºæ²¡æœ‰äººè¯´æ˜Žå…·ä½“å¦‚ä½•ã€‚ç›®å‰å‘æ ‡å‡†å§”å‘˜ä¼šæ出了使其有效的建议。它还列出了一些困难:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4471.html
更新:这是该æ案的最新版本:
http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/p0091r0.html
ç”案 1 :(得分:18)
TL; DR:模æ¿ä¸“业化
它们å¯ä»¥ï¼Œä½†åªæœ‰å‡½æ•°æœ¬èº«çš„模æ¿å‚数,而ä¸æ˜¯ç±»åž‹ã€‚
声明Foo f(0);
是éžæ³•çš„ï¼Œå› ä¸ºæ²¡æœ‰å为Foo
çš„ç±»åž‹ã€‚ä¹Ÿè®¸ä½ åœ¨è€ƒè™‘
auto f = Foo(0);
但也ä¸å…è®¸è¿™æ ·åšï¼Œå› 为编译器ä¸çŸ¥é“è¦æœç´¢çš„èŒƒå›´ï¼ˆæœ‰æ— é™çš„潜在类型,带有å为Foo
çš„æž„é€ å‡½æ•°ï¼Œå¹¶ä¸”å…·æœ‰ç‰¹åŒ–ï¼Œå¯èƒ½ä¸æ¢ä¸€ä¸ªå¸¦æœ‰æž„é€ å‡½æ•°{ {1}})
执行æ¤æ“作的常用方法是使用工厂辅助函数:
Foo(int)
å…¶ä¸å·¥åŽ‚函数的返回类型å–决于其å‚数的类型推导。
您å¯ä»¥æƒ³è±¡å·¥åŽ‚函数å¯ä»¥åœ¨å‘½å空间范围内自动生æˆï¼Œç„¶åŽåº”用通常的函数é‡è½½è§„则,但这会é‡åˆ°å¾ˆå¤§çš„å›°éš¾ï¼Œå› ä¸ºç±»åž‹å’Œæž„é€ å‡½æ•°æœ¬èº«éƒ½å¯ä»¥æœ‰æ¨¡æ¿å‚数。这些å¯ä»¥ç®€å•åœ°è¿žæŽ¥èµ·æ¥ï¼Œä½†æ˜¯è¿™ä¼šé™åˆ¶å…·æœ‰å¯å˜å‚数列表的类模æ¿ï¼Œå› 为没有办法区分类型å‚数的结æŸå’Œå‡½æ•°å‚数的开始。
ç”案 2 :(得分:8)
Foo
是一个模æ¿ï¼Œè€Œä¸æ˜¯ä¸€ä¸ªç±»ã€‚它的类型总是需è¦ä»¥æŸç§æ–¹å¼æ供,以便使用æ£ç¡®çš„类型生æˆç±»ã€‚æ‚¨æ— æ³•æ‰§è¡ŒFoo
å› ä¸ºFoo
ä¸æ˜¯ç±»åž‹ï¼Œä½†æ˜¯Foo<int>
ã€‚å®ƒåˆ›å»ºäº†ä¸€ä¸ªè¿™æ ·çš„ç±»ï¼š
class Foo {
public:
Foo( int t ) { }
};
如果您åªæä¾›Foo
,编译器将ä¸çŸ¥é“如何生æˆè¯¥ç±»ã€‚ Foo<int> f(0)
æœ‰æ•ˆï¼Œå› ä¸ºFoo<int>
生æˆäº†ç±»ï¼Œç”¨T
替æ¢int
ã€‚æ ¹æ®æ‚¨è°ƒç”¨æž„é€ å‡½æ•°çš„ç±»åž‹ï¼Œç¼–è¯‘å™¨å·²ç»çŸ¥é“æž„é€ å‡½æ•°æ£åœ¨æŽ¥å—int
。
ç”案 3 :(得分:5)
è¦å®žä¾‹åŒ–的类的å称是
Foo<int>
(如您所示)。
也å¯ä»¥å†™Foo<short> f(0)
或Foo<unsigned long> f(0)
,
或Foo<Foo<double>*> f(0)
。但是,在这些情况下,如果åªç¼–写Foo f(0)
,则ä¸å¸Œæœ›ç¼–译器能够猜出类型。
å¯ä»¥æƒ³è±¡ï¼ŒC ++ å¯ä»¥æŒ‡å®šäº†è¦åˆ¶ä½œçš„规则
ä¸€äº›è¿™æ ·çš„çŒœæµ‹åœ¨æŸäº›æ–¹é¢ï¼ˆä¾‹å¦‚,文å—0
暗示类型å‚æ•°int
而ä¸æ˜¯å…¶ä»–),但éšåŽè¯è¨€ä¼šæ›´å¤š
比现在å¤æ‚,还有其他的方法
人们编程错误。
å®žé™…ä¸Šåœ¨è¿™æ ·çš„å£°æ˜Žä¸å†™ä¸‹ä½ çš„æ„æ€
似乎没有太多è¦é—®ã€‚
修改:å‘布æ¤å†…容åŽï¼Œæˆ‘在å¦ä¸€ä¸ªå›žç”ä¸æ³¨æ„到是 æ出了制作C ++è¿™æ ·ä¸€ä¸ªåŠŸèƒ½çš„å»ºè®®ï¼Œç¡®å®žå¯ä»¥æƒ³è±¡ã€‚