2015-12-02 46 views
1

我正在阅读这个问题和其他一些东西:Are there cases where a typedef is absolutely necessary?模板转换操作符returing对数组的引用

我写了这个代码:C++ 11的

const int arrayOfInt[10] = {0}; 

template<typename T, int N> using X = const T (&)[N]; 

struct foo 
{ 
    template<typename T, int N> operator X<int,10>() { return arrayOfInt; } 
}; 

void bar(const int (&) [10]) {} 

int main() 
{ 
    bar(foo()); 
    return 0; 
} 

using功能不是为我工作,也是我无法想象如何typedef在这种情况下,返回类型也因为我的foo类不是模板本身。我需要看到解决方案使用using关键字和typedef都。非常感谢真棒的人们:)

+3

它不应该是'运营商X '? –

+0

请始终在您说某些内容不工作时,发布实际的编译器错误消息。 – Petr

+0

@KerrekSB爱你:),谢谢你帮助我们noobs :) –

回答

1
template<typename T, int N> operator X<int,10>() { return arrayOfInt; } 

模板参数T和N从不使用,因此永远不会推导出来。

固定Live On Coliru

const int arrayOfInt[10]{0}; 

template<typename T, int N> using X = T const (&)[N]; 

struct foo { 
    template<typename T, int N> operator X<T,N>() const { return arrayOfInt; } 
}; 

void bar(const int (&) [10]) {} 

int main() 
{ 
    foo f; 
    X<int, 10> v = f; 
    bar(foo()); 
} 
+0

非常感谢,但请你在我的代码模板< typename T,int N> operator X (){return arrayOfInt; }' - >'X '不会更改您的更正的代码的代码的语义,但它会产生错误。谢谢 –

+0

你更换什么部件?我没有看到区别。问题是没有办法明确指定'T'和'N'(afaik)的参数。 – sehe

+0

真棒,现在我意识到我的小错误。谢谢很多先生:) –

2

由于X是一个别名模板,你需要明确提供模板参数;他们不会从周边范围捕获:

struct foo 
{ 
    template<typename T, int N> 
    operator X<T,N>() { return arrayOfInt; } 
    //  ^^^^^ 
}; 

你不能用一个typedef做到这一点,因为没有这样的东西作为一个typedef模板。

+0

,但我仍然得到错误“错误:从'foo'类型的表达式'const int(&)[10]'的引用无效初始化” –