読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

VC++からg++への移植は変なところでやっかい

件のライブラリをLinux+g++への移植作業中不思議な現象に出会ったのでメモしておきます。
Windows+VC++時代には問題なく通っていたサンプルが突如コンパイルに失敗するのでなんでやーって思ってたわけです。
まぁ要点を切り出すと大体こんな感じのコードです。

struct hoge {
  template <int N, typename T>
  int huga(const T &t) const {
    return N;
  }
};
 
template <typename T, int N>
struct foo {
  template <typename R>
  foo(const T &t, const R &r) : i(r.huga<N>(t)) {} 
 
  int i;
};
 
int main() {
  foo<float, 0> f(0.f, hoge());
  return 0; 
}

まぁ例によってVC++の規格違反らしくて、どうもこの場合は

struct hoge {
  template <int N, typename T>
  int huga(const T &t) const {
    return N;
  }
};
 
template <typename T, int N>
struct foo {
  template <typename R>
  foo(const T &t, const R &r) : i(r.template huga<N>(t)) {} 
 
  int i;
};
 
int main() {
  foo<float, 0> f(0.f, hoge());
  return 0; 
}

みたく.の後ろにtemplateを書いてあげないといけないみたいですね。
因みにどこかにtemplate付けるのかもって発想はあったんですけど、まぁ二択を間違えてtypenameなノリで先頭につけたら当然蹴られてなんだtemplateも違うのかうーむ、って流れになってしまってました。
twitterでのpepshiso先生、yak_ex先生、fjnli先生のリプライで.の後に付けることが判明して無事解決できました。いやはやありがたいかぎりです。