2011-01-20 40 views
0
複製建築

考慮這個最小例如:可變參數模板和通過分配

template <typename T, typename U> 
struct foo {}; 

template <template <typename...> class Bar> 
struct converter 
{ 
    template <typename... Args> 
    converter(const Bar<Args...> &); 
}; 

int main() 
{ 
    converter<foo> c(foo<int,double>()); // This works. 
    // converter<foo> c = foo<int,double>(); This fails 
} 

的註釋的線路發生故障時與兩個GCC 4.5和4.6,以這樣的消息:

main.cpp:10:2: error: wrong number of template arguments (1, should be 2) 
main.cpp:4:8: error: provided for template<class T, class U> struct foo 
main.cpp: In function int main(): 
main.cpp:15:37: error: conversion from foo<int, double> to non-scalar type converter<foo> requested 

如果相反使用可變參數模板時,使用了特定數量的模板參數(即在這種情況下爲2),因此沒有錯誤。我有點困惑,因爲我預計這兩條線完全相同:這是一種預期的行爲嗎?

+0

會變換器 C =變換器(FOO ());工作? – Tomek 2011-01-20 16:58:10

+0

沒有,正如Johannes指出的那樣,這是我的錯誤,暗示main()的第一行實際上初始化了任何東西。您的建議會產生與註釋行相同的錯誤。 – bluescarni 2011-01-20 18:12:57

回答

4

是的,這是應該工作。這是一個GCC錯誤。 GCC並不支持C++ 0x variadic模板(並且公平起見,規範仍在不斷細化)。

你說什麼「This works」真的是宣告一個功能;它不會初始化一個對象,這正是你的意圖。

對於你所預期的,看到14.3.3p3介紹如何template<typename...> class Bar可以匹配foo,並14.8.2.5p9介紹如何foo<Args...>可以匹配foo<int, double>

+0

Doh,我的壞..當然你沒有真正初始化任何東西是正確的。感謝您的指點:) – bluescarni 2011-01-20 17:49:05

1
template <typename T, typename U> 
struct foo {}; 


struct converter 
{ 
template <template <typename...> class Bar, class ...Args> 
    converter(const Bar<Args...> &){} 
}; 

int main() 
{ 
    converter c1((foo<int,double>())); // This works. 
    converter c2 = foo<int,double>();// This works 
}