プラットフォームに依存する機能の移植に対処できます。Linuxで試したコンパイラ(clangおよびg ++)が次のコードを受け入れないのに、msvc++コンパイラは受け入れないという問題があります。
template <class T>
class Base {
protected:
T Value;
};
template <class T>
class Derived : public Base<T> {
public:
void setValue(const T& inValue){
Value = inValue;
}
};
int main(int argc, char const *argv[])
{
Derived<int> tmp;
tmp.setValue(0);
return 0;
}
g ++エラー:
main.cpp: In member function ‘void Derived<T>::setValue(const T&)’:
main.cpp:11:3: error: ‘Value’ was not declared in this scope
Value
これは、2番目のクラスで非依存名()が使用されているためだと思います。詳細情報。
問題は、私が非常に大きなコードベースを持っていることです。このタイプのコードは非常に頻繁に使用されます。規格を見ると間違っていると思います。ただし、を書く必要がない、this->
またはBase<T>::
を使用するたびに前に置くと非常に便利ですValue
。using Base<T>::Value;
基本クラスの最大20のメンバーを使用する場合、派生クラスの先頭に書き込むことでさえ問題があります。
だから私の質問は:この種のコードを許可するLinux用のコンパイラはありますか(追加のコンパイラスイッチの有無にかかわらず)?または、このコードをLinuxでコンパイルできるようにする小さな変更はありますか?