返回类型具有表达式参数时的编译器错误(C ++)

时间:2017-09-18 20:43:08

标签: c++ visual-studio templates

我遇到了模板表达参数的麻烦。我的代码在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;
}

0 个答案:

没有答案