我遇到了模板表达参数的麻烦。我的代码在gcc和clang中运行良好但是它无法在Visual Studio中编译时出现错误:"无法将函数定义与现有声明匹配。"
我将有问题的代码缩小到非常小的范围,但我无法理解错误的原因。似乎在返回类型的表达式参数中使用Dim
会导致问题。我通过在Bar中添加typedef Foo<Dim> Foo
来修复它,但我想知道错误的原因。这段代码应该编译吗?是否有任何理由使typedef有所作为?
#include <iostream>
template <int _Dim>
struct Foo{
enum {Dim = _Dim};
int i = Dim;
};
template <typename T>
struct Bar{
enum {Dim = T::Dim};
Foo<Dim> fun();
};
template<typename T>
Foo<Bar<T>::Dim> Bar<T>::fun()
{
return Foo<Bar<T>::Dim>();
}
int main() {
Bar<Foo<3>> myBar;
std::cout <<myBar.fun().i <<std::endl;
return 0;
}