閉じる

‘XXXX’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]

Slackware 14.0では gccが 4.7になって 4.4とは挙動が違う部分が。
その一つがこれ。
とりあえずは -fpermissiveを指定してビルドを通しているけど、時間ができたらまじめに対応しないと。

2012/10/21追記

「テンプレート中で使用されている XXXはテンプレートの定義時には見つからず、インスタンス化の時点で見つかった」という事かな?
要は以下のようなコード。

#include <iostream>

template<class T> void foo(T t)
{
bar(t);
}
void bar(int n)
{
std::cout<<n;
}
int main()
{
foo(3);
return 0;
}

テンプレートを定義する時点で識別子が見つかるよう、以下のように書き換えなさいよという事…だと思う。

#include <iostream>

void bar(int n)
{
std::cout<<n;
}
template<class T> void foo(T t)
{
bar(t);
}
int main()
{
foo(3);
return 0;
}

上記の例で Tが std::listの時に std::listに属するメソッド(insert等)を呼ぶなんて時も引っかかる。

#include <list>

template<class T>
class foo : public T{
public:
void f(int n)
{
insert(end(),n);
}
};
int main()
{
foo<std::list<int> > o;
o.f(3);
return 0;
}

その場合、thisを補ってやると逃げられる。

#include <list>

template<class T>
class foo : public T{
public:
void f(int n)
{
this->insert(this->end(),n);
}
};
int main()
{
foo<std::list<int> > o;
o.f(3);
return 0;
}

end()のようにテンプレート引数に依存しないメソッドについてはコンパイラからその旨示唆されるのかな?

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)