C++ プロジェクトで構文チェッカーとしてClangを使用しています。これは Emacs の Flycheck を介して呼び出され、迷惑な use of undeclared identifier
エラーが発生します。次の最小限の作業例で問題を説明します。
ファイル内testnamepace.cpp
:
#include "testnamespace.hpp"
int main() {
const unsigned DIM = 3;
testnamespace::A<DIM> a;
a.f();
a.g();
return 0;
}
ファイル内testnamespace.hpp
:
#ifndef testnamespace_h
#define testnamespace_h
#include <iostream>
namespace testnamespace {
// My code uses lots of templates so this MWE uses a class template
template <unsigned DIM> class A;
}
template <unsigned DIM>
class testnamespace::A{
public:
static const unsigned dim = DIM;
A() {std::cout << "A(): dim = " << dim << std::endl;}
// in my case some functions are defined in a .hpp file...
void f() {
std::cout << "call f()" << std::endl;
}
// ...and others are defined in a .ipp file
void g();
};
#include "testnamespace.ipp"
#endif
ファイル内testnamespace.ipp
:
template <unsigned DIM>
void testnamespace::A<DIM>::g() {
// ^^^^^^^^^^^^^ this results in the following error:
// testnamespace.ipp:2:6:error: use of undeclared identifier 'testnamespace' (c/c++-clang)
std::cout << "g()" << std::endl;
}
コードは (gcc バージョン 4.7.2) を使用して警告なしでコンパイルされるため、g++ -Wall testnamespace.cpp -o testnamespace
これがコーディングのエラーなのか、それとも Clang を使用することの単なる「機能」なのか疑問に思っています。