8

ネストされた名前空間とテンプレート化されたクラスに関連する問題があります。また、実際のコードと同じエラーを生成するが、もう少し読みやすいテスト ケースを作成することもできました。

2010 プラットフォーム ツールセットで VS2012 を使用して次のコードをコンパイルすると、エラーが発生します。

namespace A
{
   namespace B
   {
      namespace C1
      {
         struct SMeasResult{};
      }
      namespace C2
      {
         struct SMeasResult{};
      }
   }
}

namespace C1Test
{
   using namespace A::B::C1;

   template<typename T>
   class Fook
   {
   public:

      void Yu()
      {
         SMeasResult Field;
      }
   };
}

namespace C2Test
{
   using namespace A::B::C2;

   template<typename T>
   class Fook
   {
   public:

      void Yu()
      {
         SMeasResult Field;
      }
   };
}

void m(){
   C1Test::Fook<int> yu;
   C2Test::Fook<int> me;

   yu.Yu();
   me.Yu();
}

具体的なエラーは次のとおりです。

1>------ Build started: Project: MultiVicomTest (Visual Studio 2010), Configuration: Debug Win32 ------
1>  test.cpp
1>c:\code\test.cpp(27): warning C4101: 'Field' : unreferenced local variable
1>          c:\code\test.cpp(26) : while compiling class template member function 'void C1Test::Fook<T>::Yu(void)'
1>          with
1>          [
1>              T=int
1>          ]
1>          c:\code\test.cpp(49) : see reference to class template instantiation 'C1Test::Fook<T>' being compiled
1>          with
1>          [
1>              T=int
1>          ]
1>c:\code\test.cpp(43): error C2872: 'SMeasResult' : ambiguous symbol
1>          could be 'c:\code\test.cpp(11) : A::B::C2::SMeasResult'
1>          or       'c:\code\test.cpp(7) : A::B::C1::SMeasResult'
1>          c:\code\test.cpp(42) : while compiling class template member function 'void C2Test::Fook<T>::Yu(void)'
1>          with
1>          [
1>              T=int
1>          ]
1>          c:\code\test.cpp(50) : see reference to class template instantiation 'C2Test::Fook<T>' being compiled
1>          with
1>          [
1>              T=int
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

シンボル 'SMeasResult' が別の名前空間で使用されているため、コンパイラにとってあいまいになる理由がわかりません。これまでにわかったことは、この問題はクラスがテンプレート化されたクラスである場合にのみ発生するということです。テンプレート定義を削除すると、同じ問題は発生しません。

私が何か間違ったことをしたかどうか、誰か教えてもらえますか?

4

2 に答える 2

3

これは実際にはコンパイラのバグのように見えます。関数のバージョンがあいまいさなしにコンパイルされたことを考えると、C1Test何らかの形で using 名前空間namespace C1Testが名前空間にまで残っているのではないかと思いC2Testます。

これは、g++ 4.4 と 4.5 の両方がこのコードを正常にコンパイルできるという事実によってさらに裏付けられます。

于 2013-08-08T14:55:54.620 に答える
0

A::B::C1::SMeasResult; を使用して使用してみてください。A::B::C2::SMeasResult を使用します。C1Test および C2Test 名前空間で。これで問題は解決します。

ところで、なぜそんなに多くの名前空間が必要なのですか? STL は非常に大きいですが、使用する名前空間は std.1 つだけです。

于 2013-08-08T15:05:18.517 に答える