我面臨VS2010的奇怪問題。下面的代碼編譯失敗(而被perfectly accepted by gcc):模板化復發類型錯誤
// Instantiate each type of a type array (which is a template<int>)
// void is taken as the end of the array
template<template<int> class A, int n = 0, typename obj_type = typename A<n>::type>
struct Instantiate : public Instantiate<A,n+1>
{
obj_type object;
Instantiate() : object() {}
};
template<template<int> class A, int n>
struct Instantiate<A,n,void>
{
};
// Does not compile
template<typename O>
struct test
{
template<int n, bool=true> struct array { typedef void type; };
template<int n> struct array2 { typedef typename array<n>::type type; };
template<bool u> struct array<0,u> { typedef int type; };
template<bool u> struct array<1,u> { typedef float type; };
template<bool u> struct array<2,u> { typedef bool type; };
Instantiate<array2> objects;
};
int main()
{
test<int> obj;
}
,錯誤如下:
C1202: recursive type or function dependency context too complex
see instanciation of class template 'Instantiate<A,n>'
with
[
A=test<O>::array2,
n=1
]
(and so on, up to n=497...)
製作test
一個非模板(即,中庸之道除去線template<typename O>
)解決了錯誤。然而,儘管在這個簡單的例子中是可能的,但在我的代碼中這是不可能的(這更復雜)。
的問題是:
- 哪個是正確的,VS或GCC?或者它是一個VS錯誤?
- 在這種情況下,VS是錯誤的,是否有解決方法?
編輯: - 從傑裏的回答,似乎這是一個編譯器錯誤...它被固定在VS2012。 - 生成的類層次結構應該是:
Instantiate<array2, 3, void> // end of recursion
^
|
Instantiate<array2, 2, bool>
^
|
Instantiate<array2, 1, float>
^
|
Instantiate<array2, 0, int>
這可能是有用的http://stackoverflow.com/questions/4357854/c-template-compilation-error-recursive-type-or-function-dependency – 2013-03-25 17:08:07
@Shafik我已經看到它,它不是那個錯誤。不管怎樣,謝謝你。 – Synxis 2013-03-25 17:09:44
您是否嘗試過將array2模板移動到數組<2,u>專業化?這有什麼不同嗎? – Tomek 2013-03-25 18:40:49